Lin*_* Ma 1 java enums serialization
为了免费序列化(Effective Java Edition 2,Item 3),在Enum中定义INSTANCE是一个很好的做法.如果有人能够解释它意味着什么,它会很棒.
林先生,提前谢谢
这是一个演示:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里我们有一个"简单的"基于类的单例和基于枚举的版本.
我们将两个实例写出来ObjectOutputStream
,然后再读回来.输出是false
然后true
,显示出与基于类的单,我们已经结束了2种的情况下ClassSingleton
......我们的"正常"的一个,并通过反序列化创建的.EnumSingleton
然而,我们只有一个实例,因为枚举具有序列化/反序列化代码以保留它们的"固定值集"性质.您也可以为基于类的单例编写此代码,但不必更容易.