是否需要将类标记为final以使其不可变?

时间:2018-03-10 07:18:11

标签: java

java中不变性的概念说,该类需要被标记为final才能使其成为不可变的。 我的问题是,如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它将是可变的而不是基类。基类的状态/属性将保持不变,因为我们将基类的属性标记为私有。

第二个问题是不可变类和不可变对象在java中有两个不同的概念?

1 个答案:

答案 0 :(得分:2)

  

如果我们不将一个类标记为final,那么它可以被子类化,但它仍然是子类的对象,它是可变的而不是基类。基类的状态/属性将保持不可变,因为我们将基类的属性标记为私有。

假设我们的课程C1只有final个字段,但本身并未声明为final

当某人创建一个类C2作为C1的子类时,他们可以在C2中包含可变字段。由于C2的实例也是C1的实例,我们现在可能会更改C1 的某些实例。因此,我们不能将C1视为不可变类。

  

java中的不可变类和不可变对象是两个不同的概念吗?

是的。的种类。这取决于你与谁交谈:

  • 有些人会争辩说,不可变对象是任何不可变类的实例。

  • 其他人会争辩说,不可变对象是构造后无法更改的任何对象。例如here。并且(通过一些延伸)将包括由于API(即方法)语义的原因而不能纯粹改变的对象。

我会避免使用术语“不可变对象”而不澄清这两个定义中的哪一个适用。

为了说明歧义,使用new C1()创建的实例可以被视为不可变对象(因为它不能被更改)或不被视为(因为它不是不可变类的实例)。