java:关于不可变和最终的问题

Vin*_*C M 3 java final immutability

我正在读"Effective Java"一书.

在最小化可变性项目中,Joshua Bloch讨论了使一个类不可变的问题.

  1. 不提供任何修改对象状态的方法 - 这很好.

  2. 确保无法扩展该类. - 我们真的需要这样做吗?

  3. 让所有领域成为最终 - 我们真的需要这样做吗?

例如,假设我有一个不可变类,

class A{
private int a;

public A(int a){
    this.a =a ;
}

public int getA(){
    return a;
}
}
Run Code Online (Sandbox Code Playgroud)

从A延伸出来的课程如何影响A的不变性?

Aas*_*set 6

像这样:

public class B extends A {
    private int b;

    public B() {
        super(0);
    }

    @Override
    public int getA() {
        return b++;
    }
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您不是要修改从中继承的字段A,但在不可变对象中,同一个getter的重复调用当然应该产生相同的数字,这不是这里的情况.

当然,如果您坚持使用规则#1,则不允许您创建此覆盖.但是,您无法确定其他人是否会遵守该规则.如果您的某个方法将A参数作为参数并对其进行调用getA(),则其他人可以B按上述方法创建该类,并将其实例传递给您的方法; 然后,您的方法将在不知情的情况下修改对象.