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

时间:2009-01-09 12:32:59

标签: java singleton

以SO Best Singleton Implementation In 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()

4 个答案:

答案 0 :(得分:95)

假设您绑定到将使用它所给出的任何对象的属性的东西 - 您可以非常轻松地传递Elvis.INSTANCE,但是您无法传递Elvis.class并期望它找到该属性(除非它是故意的编码以查找类的静态属性。

基本上,当您想要实例时,您只使用单例模式。如果静态方法适合您,那么只需使用它们,而不要打扰枚举。

答案 1 :(得分:68)

当你的单身人士必须实现一个接口时,一个很大的优势。按照你的例子:

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

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

使用:

public interface HasAge {
    public int getAge();
}

用静力学无法做到......

答案 2 :(得分:9)

(有状态)单身人士通常习惯于假装不使用静态变量。如果你实际上没有使用公开静态变量那么你就会欺骗更少的人。

答案 3 :(得分:8)

我会选择最简单,最清晰的选项。这有点主观,但如果你不知道什么是最清楚的,那就选择最短的选项。