在Java Enum中实例化

为了免费序列化的好处,在Enum中定义INSTANCE是一种很好的做法(Effective Java Edition 2,Item 3)。 如果有人能够解释它意味着什么,它会很棒。

在Java中使用Enum作为单例的最佳方法是什么?

林先生,提前谢谢

这是一个演示:

 import java.io.*; class ClassSingleton implements Serializable { public static final ClassSingleton INSTANCE = new ClassSingleton(); private ClassSingleton() {} } enum EnumSingleton { INSTANCE; } public class Test { public static void main(String[] args) throws IOException, ClassNotFoundException { byte[] data; try (ByteArrayOutputStream output = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(output)) { oos.writeObject(ClassSingleton.INSTANCE); oos.writeObject(EnumSingleton.INSTANCE); data = output.toByteArray(); } try (ByteArrayInputStream input = new ByteArrayInputStream(data); ObjectInputStream ois = new ObjectInputStream(input)) { ClassSingleton first = (ClassSingleton) ois.readObject(); EnumSingleton second = (EnumSingleton) ois.readObject(); System.out.println(first == ClassSingleton.INSTANCE); System.out.println(second == EnumSingleton.INSTANCE); } } } 

在这里,我们有一个“简单的”基于类的单例和基于枚举的版本。

我们将两个实例写出到ObjectOutputStream ,然后再次读回它们。 输出为false然后为true ,表明使用基于类的单例,我们最终得到了两个 ClassSingleton实例…我们的“普通”实例和反序列化创建的实例。 然而,我们只有一个EnumSingleton实例,因为枚举具有序列化/反序列化代码以保留它们的“固定值集”性质。 您也可以为基于类的单例编写此代码,但不必更容易。