不可变是指一旦对象的构造函数完成执行,该实例将无法更改。
这很有用,因为它意味着你可以传递对对象的引用,而不必担心别人会更改其内容。尤其是在处理并发时,永远不变的对象没有锁定问题
例如
class Foo
{
private final String myvar;
public Foo(final String initialValue)
{
this.myvar = initialValue;
}
public String getValue()
{
return this.myvar;
}
}
Foo不必担心调用方getValue()
可能会更改字符串中的文本。
如果你想象与相似的类Foo
,但是成员带有StringBuilder
而不是String,则可以看到的调用者getValue()
将能够更改实例的StringBuilder
属性Foo。
还要注意你可能会发现的各种不变性:埃里克·利珀特(Eric Lippert)
撰写了一篇有关此的博客文章。基本上,你可以拥有其接口是不可变的对象,但是在幕后是实际的可变私有状态(因此不能在线程之间安全地共享)。