不变性vs线程安全



Java不可变类可以通过

声明来创建
  1. 声明所有成员字段为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++;
    }
}

如果barfinal,上面的代码将无法编译。

我可以说,如果一个类是不可变的意味着它是线程安全的?

不一定,但在很多情况下是可以的。

最新更新