java - 用这个实例化的单例

标签 java singleton

我有一项学校作业,我必须在某个给定项目中发现模式。一切都很好(嗯,相对地..)但我发现的大多数模式似乎都是某种变化。我必须找到的单例也不异常(exception)。

代码如下。奇怪的是,这个类似乎没有像人们期望的那样使用以下构造函数进行实例化:

public Singleton() {
    if (singleton == null) {
        singleton = new Singleton();
    }
}

但是,它是用 this 实例化的(正如您在下面的原始代码中看到的那样)?以我的理解,这会创建某种静态单例?调试了一下确实看到构造函数第一次调用的是

Singleton x = new Singleton();
        x.Print();

,它确实是空的。 this 是一个 Singleton 实例。但是,不应该有

private static Singleton singleton = new Singleton();

在类之上而不是 singelton = this;?

public class Singleton {

    private static Singleton singleton;

    public static Singleton getDefault() {
        return singleton;
    }

    /**
     * The constructor.
     */
    public Singleton() {
        if (singleton == null) {
            singleton = this;
        }
    }

    public void Print()
    {
        System.out.println("I'm a singleton!");
    }

}

我很确定它确实是一个单例,它只是我从未见过的类型,我也不知道背后的原因,这就是我的基本要求。

最佳答案

通常有两种创建单例类的方法,都基于保持构造函数私有(private)。
第一种方法:

public class Singleton
{
  public static final Singleton INSTANCE = new Singleton();

  private Singleton{...}
}

你像这样创建一个实例:Singleton single = Singleton.INSTANCE;

第二种方法:

public class Singleton
{
  private static final Singleton INSTANCE = new Singleton();

  private Singleton(){...}

  public static Singleton getInstance(){ return INSTANCE; }

}

在这种情况下,您创建一个这样的实例:Singleton single = Singleton.getInstance(); 然后将 getInstance() 方法视为公共(public)工厂方法。

如您所见,在这两种情况下,new 关键字肯定用于创建类的单个实例,但由于所使用的模式,只能有一个实例,不能有更多。您不需要使用“this”关键字。 希望这会有所帮助。

关于java - 用这个实例化的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21956333/

相关文章:

java - 为什么在 Set/List/Map 中包装元素的方法在名称中包含 'singleton'?(java.util.Collections)

java - 使用单例类、Tomcat、C3P0 在 Java Web 应用程序中管理池数据源

ios - swift中静态函数和单例类的区别

Swift Singleton 用于在委托(delegate)中预加载纹理而不将数据传输到其他类

java - 单例变量不会跨系统持久存在

java - 如果已经找到数组,则无法删除该数组(数组搜索排序)

java - 在 Android Q 中从外部存储访问照片

java - 使用 Google 应用引擎数据存储加载枚举集合

java - 通过 java apache POI 在 excel 文件中追加新行

java - 关于 Java 类的 netsec 项目的想法?