所有最终类都是不可变的吗?

Java中的所有最终类都是不可变的。 String和Integer都是最终的类,两者都是不可变的。

不 – 最后一堂课意味着你不能从中inheritance。 它与可变性无关。 以下类是最终的但是可变的:

public final class FinalMutable { int value; public void setValue(int v) { value=v; } public int getValue() { return value; } } 

不,最终意味着课程无法延期。 它没有说明可变性。 例如:

 final class MutInt { public int modifyMe; } 

没有关键词的不变性,它更像是一种设计模式。

编辑:
这意味着,没有关键字,使一个类不可变。 要使类不可变,您必须通过使其成为最终或私有来保护内部。

令人困惑的是:final关键字在类上使用时具有不同的含义,然后在字段/变量上使用时具有不同的含义。 前者的意思是“这个课程不能延长”。 第二个意思是“这个变量(或参考)不能改变”。

除了其他响应之外,如果你看一下java.lang.String的代码,你会看到它包含一个字段: hash ,它是可变的,实际上是在第一次调用hashCode()时计算和存储的。

但是,该类仍然是不可变的hash字段不能直接访问或在类外修改。

此外,您可能会注意到JDK中的一个常见方法是实现不可变包装器,这些包装器可用于公开对象的内部状态而不允许对其进行修改; 例如

 private final List values; public List getValues() { return Collections.unmodifiableList(values); } 

正如其他人所说的那样,尽管它在不变性战略中发挥作用,但final并没有在Java中创造出一个可用的类。 要获得不变性,您应该遵循一般指导原则:

  • 确保不能覆盖类 – 使类final ,或使用静态工厂并保持构造函数私有
  • 将字段设为privatefinal
  • 强制调用者在一个步骤中完全构造一个对象,而不是使用无参数构造函数和后续调用setXXX方法(即避免Java Beans约定)
  • 不提供任何可以以任何方式改变对象状态的方法 – 不仅仅是setXXX方法,而是任何可以改变状态的方法
  • 如果类具有任何可变对象字段,则在类与其调用者之间传递时必须对其进行防御性复制

子类的重写方法无法访问私有字段…所以子类方法无法更改超类的私有字段…那么将不可变类作为final是什么用途?

最终关键字阻止其他类inheritance它。 Final关键字不会使它成为不可变的,但是存在这样的条件:使实例类成员变为私有,也可以使用getter而不是使用setter