基于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()
假设你绑定到将使用它给出的任何对象的属性的东西 - 你可以很容易地传递Elvis.INSTANCE,但是你不能通过Elvis.class并期望它找到属性(除非它被故意编码找到类的静态属性).
基本上,只有在需要实例时才使用单例模式.如果静态方法可以正常工作,那么只需使用它们,不要打扰枚举.
当你的单身人士必须实现一个接口时,一个很大的优势.按照你的例子:
public enum Elvis implements HasAge { INSTANCE; private int age; @Override public int getAge() { return age; } }
附:
public interface HasAge { public int getAge(); }
它不能用静力学来完成......
(有状态)单身人士通常习惯于假装不使用静态变量.如果你实际上没有使用公共静态变量,那么你会欺骗更少的人.
我会选择最简单,最清晰的选项.这有点主观,但如果你不知道什么是最清楚的,那就选择最短的选项.