是一个只有静态成员的类是不可变的吗?

时间:2016-11-28 13:42:53

标签: java

只有静态成员的类是不可变的吗?还是接近不变?

2 个答案:

答案 0 :(得分:1)

技术上,是的。

Definition of immutability:

  

不可变意味着一旦对象的构造函数完成执行,该实例就不能被更改。

假设你有这门课程:

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重置它