具有ArrayList成员变量的不可变对象-为什么可以更改此变量?
|
我有一类具有各种成员变量的类。有一个构造函数,有getter方法,但没有setter方法。实际上,该对象应该是不变的。
public class Example {
private ArrayList<String> list;
}
现在我注意到了以下几点:当我用getter方法获得变量列表时,可以添加新值,依此类推-可以更改ArrayList
。当我下次调用此变量get()
时,将返回更改后的ArrayList
。怎么会这样?我没有再次设置它,我只是在做它!
使用String
时,此行为是不可能的。那么,这里有什么区别?
没有找到相关结果
已邀请:
9 个回复
蹄渭信妥扳
变成
也可以
但这是不允许的:
为了使列表不可变(也防止第一行),建议您使用
:
(请注意,这将创建列表的不可修改视图。如果有人坚持使用原始参考,则仍可以通过该列表来修改列表。) 使用字符串,此行为是不可能的。那么,这里有什么区别? 这是因为
已经是不可变的(不可修改),就像将列表变成不可修改的列表一样。 比较:
哩翔购
不是一成不变的。 如果您不想更改列表,请返回它的副本:
或者您可以返回一个不可修改的列表:
bab
。当然,这不会阻止它包装的列表的更改,但是它将阻止仅引用不可修改列表的任何人修改内容。 有关真正的不可变列表,请查看Guava的ImmutableList类。
亨尖玛次酥
如果将其退还给客户,他们将无法向其添加或删除元素。但是,它们仍然可以从列表中删除元素-因此,如果您要这样做,则必须确保它们也是不可变的!
郡晒景沧
痰降锭骂奸
抢垢洛韧
导力疵谜
熊融炭臀陛