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

2022-08-31 11:43:58

基于SO问题中编写的内容,Java中的最佳单例实现 - 即关于使用枚举创建单例 - 它们之间的区别/优点/缺点是什么(省略构造函数)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

,然后呼叫Elvis.INSTANCE.getAge()

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

,然后呼叫Elvis.getAge()


答案 1

假设你正在绑定到一个将使用它所给定的任何对象的属性的东西 - 你可以很容易地传递Elvis.INSTANCE,但你不能传递Elvis.class并期望它找到属性(除非它被故意编码以查找类的静态属性)。

基本上,您只在需要实例时才使用单例模式。如果静态方法对您来说工作正常,那么只需使用这些方法,不要打扰枚举。


答案 2

一个很大的优势是当你的单例必须实现一个接口时。按照您的示例操作:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

跟:

public interface HasAge {
    public int getAge();
}

它不能用静态来完成...


推荐