在 Java 中实现单例模式最有效的方法是什么?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接

原问题地址:stackoverflow.com/questions/7…

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
喜欢就支持一下吧
点赞0 分享