只有静态成员的类是不可变的吗?还是接近不变?
答案 0 :(得分:1)
技术上,是的。
不可变意味着一旦对象的构造函数完成执行,该实例就不能被更改。
假设你有这门课程:
public class MyClass {
public static int a = 0;
}
当您创建此类的实例时,您无法改变"它,因为没有什么可以改变,改变价值!没有非静态成员!
所以是的,这样的课程是不可改变的。
答案 1 :(得分:1)
如果字段都是final
并且是原始的或不可变的,那么你有一个不可变的类。注意:仅仅创建一个字段final并不能使它成为不可变的。
// not immutable!
private static final Set<String> words = new HashSet<>();
public static void addWord(String word) { words.add(word); }
注意:此规则对immutable的一个例外是使用反射或本机方法。反射/本机方法可以尝试覆盖甚至最终值。使用它的一个地方是java.lang.System
public final static PrintStream out = null;
因此,您可能会认为System.out
始终是null
并且您无法编写Hello World程序,但是哦,不能通过本机代码以类似于此方法的方式设置确实
public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
}
private static native void setOut0(PrintStream out);
事实上,System.out
确实会在启动时被JVM重置,您可以使用System.setOut
重置它