在Java Enum中实例化

Lin*_* Ma 1 java enums serialization

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

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

林先生,提前谢谢

Jon*_*eet 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们有一个"简单的"基于类的单例和基于枚举的版本.

我们将两个实例写出来ObjectOutputStream,然后再读回来.输出是false然后true,显示出与基于类的单,我们已经结束了2种的情况下ClassSingleton......我们的"正常"的一个,并通过反序列化创建的.EnumSingleton然而,我们只有一个实例,因为枚举具有序列化/反序列化代码以保留它们的"固定值集"性质.您也可以为基于类的单例编写此代码,但不必更容易.