gpt4 book ai didi

java - 非最终类可以完全不可变吗?

转载 作者:行者123 更新时间:2023-12-02 08:37:49 25 4
gpt4 key购买 nike

没有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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com