在Java Enum中实例化

时间:2015-04-12 03:04:36

标签: java serialization enums

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

What is the best approach for using an Enum as a singleton in Java?

提前谢谢, 林

1 个答案:

答案 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实例,因为枚举具有序列化/反序列化代码来保存它们的固定值集合"性质。您也可以为基于类的单例编写此代码,但不必更容易。