小编典典

在Java中实现单例模式

java

谁能提供一个单例模式的示例并解释为什么有必要吗?


阅读 225

收藏
2020-09-16

共1个答案

小编典典

在走单身路线之前,请重新考虑。您真的需要单身人士吗?如果您需要实现单例的方案,那是因为对它们的需求并没有真正表达出来。您最好不要仅在代码库中引入单例,因为遵循设计模式会很酷。

干净的代码讨论-全局状态和单例

一次还不够

表演者单身人士

但是,真正值得了解的是Dependency
Injection

现在,如果您真的想用Java实现单例,那么我将推荐Joshua
Bloch的“有效Java”实现方法:

public class Singleton
{
  public static Singleton getInstance() {
    return SingletonHolder.instance;
  }

  private Singleton() {}

  private static final class SingletonHolder {
    static final Singleton instance = new Singleton();    
  }
}

JLS保证JVM不会初始化实例,直到有人呼叫getInstance();

最后要注意的是,在Java直至Java
5中
Double
Checked锁定模式均已中断
Java
5内存模型使DCL模式线程安全,但是SingletonHolder在最初的意图是性能优化的同时,它使其速度比类方法慢

编辑:正如@Luno指出的那样,自从本书第二版以来,首选方法是:

从1.5版开始,存在第三种实现单例的方法。只需使用一个元素创建一个枚举类型:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() { ... }
}

此方法在功能上与公共领域方法等效,除了它更简洁,免费提供序列化机制,甚至针对复杂的序列化或反射攻击,还提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用,
但是单元素枚举类型是实现单例的最佳方法。

2020-09-16