在Enum中定义INSTANCE是一个很好的做法,为了免费序列化(Effective Java Edition 2,Item 3)。如果有人能够解释它意味着什么,它会很棒。
What is the best approach for using an Enum as a singleton in Java?
提前谢谢, 林答案 0 :(得分:5)
这是一个示范:
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
,表明使用基于类的单例,我们最终得到了{em>两个 ClassSingleton
个实例...我们"正常"一,和反序列化创建的那个。然而,我们只有一个EnumSingleton
实例,因为枚举具有序列化/反序列化代码来保存它们的固定值集合"性质。您也可以为基于类的单例编写此代码,但不必更容易。