以下类(class)没有 final
关键字,但它的成员变量是 private
和 final
并且该类没有公开 mutate/set 方法。这个类是不可变的吗?
public class Abc {
private final int id;
private final String name;
public Abc(int id, String name) {
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
}
最佳答案
类本身是不可变的,是的 - 如果您仅创建 Abc
的实例,在创建实例后,任何方面都无法更改。
但是,这并不意味着任何代码都会接收类型为 Abc
的参数。可以假设它具有不可变的所有优点...因为该类不是 final
.与 Abc
兼容的类型的对象完全有可能可变:
public class Mutable extends Abc {
private String value;
public Mutable(int id, String name) {
super(id, name);
}
public void setValue(String value) {
this.value = value;
}
@Override public String toString() {
return value;
}
}
现在假设您有处理 Abc
的代码。 :public class AbcConsumer {
private final Abc abc;
public AbcConsumer(Abc abc) {
this.abc = abc;
}
// No need to create a defensive copy or anything like that...
// abc is immutable, right?
public Abc getAbc() {
return abc;
}
}
在这里,消费者认为可以治疗 Abc
好像它是一个不可变的类 - 但是如果有人创建了一个 AbcConsumer
通过传入 Mutable
实例而不是“ Vanilla ”Abc
例如,它可能会导致问题。这就是为什么在创建不可变类型以使其成为
final
时通常是个好主意的原因。同样 - 这样任何消费者都知道,如果他们收到该类型的引用,它绝对是不可变的。换句话说:是的,
Abc
类是不可变的...但你不能假设一个编译时类型为 Abc
的引用指的是一个不可变的对象。
关于java - 这个类是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66519121/