以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()
答案 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)
我会选择最简单,最清晰的选项。这有点主观,但如果你不知道什么是最清楚的,那就选择最短的选项。