Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用此函数实例化的Singleton_Java_Singleton - Fatal编程技术网

Java 使用此函数实例化的Singleton

Java 使用此函数实例化的Singleton,java,singleton,Java,Singleton,我在学校有一个作业,我必须找出某个给定项目中的模式。一切都很好(嗯,相对而言…),但我发现的大多数模式似乎都是某种变异。我要找的单身汉也不例外 代码如下所示。奇怪的是,这个类似乎不像人们所期望的那样,使用以下构造函数进行实例化: public Singleton() { if (singleton == null) { singleton = new Singleton(); } } 但是,它是用这个安装的(正如您在下面的原始代码中看到的)?在我的理解中,这创造

我在学校有一个作业,我必须找出某个给定项目中的模式。一切都很好(嗯,相对而言…),但我发现的大多数模式似乎都是某种变异。我要找的单身汉也不例外

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

public Singleton() {
    if (singleton == null) {
        singleton = new Singleton();
    }
}
但是,它是用
这个
安装的(正如您在下面的原始代码中看到的)?在我的理解中,这创造了某种静态的单例?我调试并发现,在第一次调用构造函数时

Singleton x = new Singleton();
        x.Print();
,它确实是空的。
这是一个单例实例。然而,难道不是吗

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

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

您的代码没有遵循
单例模式。下面我展示了一个遵循单例模式的类<代码>此
引用当前对象实例。当您在构造函数内部使用
this
初始化单例引用时,它调用默认(无参数)构造函数并将其分配回
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());
    }
}

希望你能理解

我认为你混淆了这个
的意思<代码>此
不是实例化类,
引用新创建的实例。然后,无论何时有人调用您的构造函数,都会创建(并返回)一个新实例,而不管您存储在
private static Singleton Singleton中或否。

正如@dic19所说的那样,为了防止存在多个实例,您必须使构造函数
私有化。

如果重点不是像您所说的那样修改代码,那么重点是报告这个类不是单例

您可以检查调试:

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

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

如果我们使用
singletone
我们不需要创建实例来使用。因为当我们创建
singletone
时,如果没有创建,我们就是在创建
新实例。
看看下面的代码:

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();
    }
}

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

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

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

  private Singleton(){...}

  public static Singleton getInstance(){ return INSTANCE; }

}
创建如下实例:Singleton single=Singleton.instance

第二种方法:

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

  private Singleton{...}
}
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”关键字。
希望这有帮助。

重点不是修改代码;重点是报告为什么这是一个单身。很明显,这是一个单例,但我不清楚“this”是如何实现的。您在调用构造函数时创建实例,因此
this
引用您的实例(通常使用
this.name=name
为成员变量赋值)。由于singleton尚未初始化,因此它将为
null
,您可以将其与实例一起分配。在此之后,进一步的初始化当然有
singleton!=null
,因此不会进行新的赋值。然而,这种方法并不是很干净,因为调用
Singleton.getDefault().Print()
将导致nullPointerException。它根本不是单例,因为任何人都可以调用构造函数并获得新实例。这是蹩脚的代码,没有别的。当然不是设计模式。没有任何意义。我真的希望老师的意图是让你发现这段代码的糟糕之处,而不是让你相信它实际上是一个单例。我一直在检查代码,据我所知,它实际上从未被使用过。。我所能看到的只是将
Singleton.class
传递给其他方法,而这些方法我无法进行任何修改。