扩展final
类的abstract
类是否可以是不可变的?
例如:
public abstract class Parent {}
public final class Child extends Parent {}
Child
是不可变的吗?
答案 0 :(得分:3)
这不是一成不变的。
它无法扩展。
定义了不可变类,因此没有方法可以改变它们的内部状态,例如: java.lang.String
(也恰好是final class
)。
最终课程无法延期。作为副产品,这就是您无法获得最终abstract class
或final interface
的原因。
这通常有助于确保不变性,但它只是相关的。
最后,线程安全是另一个特性,它不一定需要不变性,甚至更少与防止继承有关。
请参阅here和子章节,以便更好地了解不变性。
注意强>
如果你的类通过继承层次结构完全为空,而你的叶类是final
,那么它实际上是不可变的,因为没有什么可以变异的。
当然,这也是毫无意义的。
答案 1 :(得分:0)
Child
类的不可变性不受类声明的final
关键字控制。要使您的类不可变,请以这种方式进行设计,以便在创建类实例时不能更改其状态。
将final
添加到类声明中,只是无法扩展您的类。
例如:
public final class Child extends Parent {
private final String someText; // final is not necessary there, but it is a good practice, to declare fields like this as final. Because it gets its value once, and does not change later.
public Child(String someText) {
super(); // calling parent's constructor
this.someText = someText;
}
public String getSomeText() {
return this.someText;
}
}
请注意,由于您已创建Child
类的实例,因此无法更改其内容。所以,这个类是不可变的。