没有final修饰符的类可以完全不可变吗?
例如,下面的类是不可变的吗?
class Animal
{
private String animalName;
public Animal(String name) {
animalName = name;
}
public String getName() { return animalName; }
}
最佳答案
是的。
该类(如您的问题中所述)是不可变的,因为其内部状态都不会改变。即使您要定义 Animal
类的子类,它也无法更改 animalName
;然而,虽然 Animal
类是不可变的,但它的子类可能是也可能不是不可变的(取决于它们的实现)。
这样做的危险在于,如果有人将子类定义为 Animal
类中的内部类(如下所示),那么他们可能会违反您的不变性:
class Animal {
private String animalName;
public Animal(String name) {
animalName = name;
}
public getName() { return animalName; }
public class Eagle extends Animal {
public Eagle() {
super("Eagle");
}
public void foo() {
animalName = animalName + "!";
}
}
}
因此,只要有可能,最好使用 private
可见性和 final
修饰符。这将防止人们意外地引入违反您打算施加的不变性或封装约束的代码。这样,程序员必须有意识地决定增加可见性或删除 final
关键字,因此他们不会引入任何上述“意外”。
关于java - 非最终类可以完全不可变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7976589/