来自抽象父母的不可变子

时间:2015-09-03 15:15:35

标签: java

扩展final类的abstract类是否可以是不可变的?

例如:

public abstract class Parent {}

public final class Child extends Parent {}

Child是不可变的吗?

2 个答案:

答案 0 :(得分:3)

这不是一成不变的。

它无法扩展。

定义了不可变类,因此没有方法可以改变它们的内部状态,例如: java.lang.String(也恰好是final class)。

最终课程无法延期。作为副产品,这就是您无法获得最终abstract classfinal 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类的实例,因此无法更改其内容。所以,这个类是不可变的。