本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接
Q:
在 Java 中实现单例模式最有效的方法是什么?
A:
使用 enum 枚举类:
public enum Foo {
INSTANCE;
}
复制代码
Joshua Bloch 在 Google I / O 2008 上的 Effective Java reloaded 演讲中提到了这个方法:可以看看他的演讲视频,另外可以参考下他演讲的 PPT 的第 30-32 页的部分。
实现可序列化单例的正确方法
public enum Elvis {
INSTANCE;
private final String[] favoriteSongs =
{ "Hound Dog", "Heartbreak Hotel" };
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
}
复制代码
这种方法在功能上类似于 public 字段,它除了更简洁外,还自带序列化机制,并且即使面对复杂的序列化或反射攻击,也提供了针对多重实例化的明确保证。尽管这种方法尚未得到广泛采用,但是单元素枚举类型是实现单例的最佳方法。
Other
看看其他创建单例模式的方法:
-
双重检查锁
public class DoubleCheckedLockingSingleton { private static volatile DoubleCheckedLockingSingleton INSTANCE; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if(INSTANCE == null) { synchronized(DoubleCheckedLockingSingleton.class) { // Double checking Singleton instance if(INSTANCE == null) { INSTANCE = new DoubleCheckedLockingSingleton(); } } } return INSTANCE; } } 复制代码
-
静态工厂方法
public class Singleton { // Initialized during class loading private static final Singleton INSTANCE = new Singleton(); // To prevent creating another instance of 'Singleton' private Singleton() {} public static Singleton getSingleton() { return INSTANCE; } } 复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END