Singleton用这个实例化

时间:2014-02-22 15:28:36

标签: java singleton

我有一份学校作业,我必须在某个特定项目中发现模式。一切都很好(相对而言......)但似乎我发现的大多数模式都是某种变化。我必须找到的单身人士也不例外。

代码如下。关于这一点的奇怪之处在于,这个类似乎没有用以下构造函数实例化,正如人们所期望的那样:

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!");
    }

}

我很确定它确实是一个单身人士,它只是我从未见过的类型,而且我没有得到它背后的推理,这就是我基本上要求的。

4 个答案:

答案 0 :(得分:1)

创建Singleton类通常有两种方法,两种方法都基于保持构造函数的私有性 第一种方法:

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()方法视为公共工厂方法。

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

答案 1 :(得分:0)

您的代码遵循Singleton模式。我在Singleton模式后面显示了一个类。 this指的是当前的对象实例。在构造函数中使用this初始化单例引用时,它会调用默认(no-args)构造函数并将其分配回this引用,然后将其分配给singleton类成员变量

public class Singleton {

    private static Singleton singleton;

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

    /**
     * The constructor.
     */
    private Singleton() {
        System.out.println(singleton);
        if (singleton == null) {
                /*this will call a default constructor
                 *and instantiate Singleton object
                 */
            singleton = this;
        }
    }

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


    public static void main(String[] args) {
        Singleton singleton = Singleton.getDefault();
        System.out.println(singleton.Print());
    }
}

希望你能理解!

答案 2 :(得分:0)

我认为你的意思令人困惑或thisthis未实例化类,this引用新创建的实例。然后,每当有人调用您的构造函数时,无论您是否存储在private static Singleton singleton;中,都会创建(并返回)新实例。

同样说@ dic19你必须使你的构造函数private防止存在多个实例。

如果要点不是如你所说的那样修改代码,那么关键是要报告这个类不是单例。

您可以查看调试:

    Singleton x = new Singleton();
    Singleton x1 = new Singleton();
    Singleton x2 = new Singleton();

你会看到这三个都是不同的实例,只是你创建的第一个Singleton.getDefault()

答案 3 :(得分:0)

如果我们使用singletone,我们不需要创建实例以供使用。因为当我们创建singletone时,如果没有创建,我们就会创建new instance。 看看下面的代码:

public class Singleton {
    private static Singleton singleton;

    private Singleton() {
    }

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

    public void testSingleTone(){
        System.out.println("test");
    }

    public static void main(String[] args){
        Singleton.getSingleton().testSingleTone();
    }
}