Java不可变类可以通过
声明来创建- 声明所有成员字段为final。
如果没有setter并且类声明为final,为什么要将成员设置为final?
而且,我可以说,如果一个类是不可变的意味着它是线程安全的吗?
如果没有setter并且类声明为final,为什么要将成员设置为final?
避免内部状态被修改内部。下面的类从外部看起来是不可变的,并且我们期望对getBar()
的调用没有副作用(这意味着无论何时当我们调用该方法时,我们期望得到相同的结果,也称为决定论)。然而,它不是,因为调用doThing()
对bar
有副作用。
public final class Foo {
private int bar;
public Foo(int bar) {
this.bar = bar;
}
public int getBar() {
return bar;
}
public void doThing() {
//do some things
//increment bar for some reason
bar++;
}
}
如果bar
是final
,上面的代码将无法编译。
我可以说,如果一个类是不可变的意味着它是线程安全的?
不一定,但在很多情况下是可以的。