86

基于 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

4 回答 4

96

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

基本上,您只在需要实例时才使用单例模式。如果静态方法适合您,那么只需使用这些方法,不要打扰枚举。

于 2009-01-09T12:39:01.630 回答
69

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

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

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

和:

public interface HasAge {
    public int getAge();
}

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

于 2009-01-09T14:05:37.680 回答
9

(有状态的)单例通常用于假装不使用静态变量。如果您实际上不使用公共静态变量,那么您将愚弄更少的人。

于 2009-01-09T12:57:30.847 回答
8

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

于 2009-07-19T11:16:08.337 回答