Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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_Class - Fatal编程技术网

Java 从类外部调用时创建多个对象的SingleTon类

Java 从类外部调用时创建多个对象的SingleTon类,java,class,Java,Class,我编写了一个程序,从主类内部调用一个单例类。我还编写了另一个类,试图从中为Singleton类创建一个对象。我发现,当我尝试从另一个类调用该方法时,我只能创建一个对象,但当我尝试从同一个类调用该方法时,它会创建多个对象。我不明白同一个类的主方法和其他类的主方法有什么不同。 以下是课程: SingleTonClass.java public class SingleTonClass { private static SingleTonClass obj = null; priv

我编写了一个程序,从主类内部调用一个单例类。我还编写了另一个类,试图从中为Singleton类创建一个对象。我发现,当我尝试从另一个类调用该方法时,我只能创建一个对象,但当我尝试从同一个类调用该方法时,它会创建多个对象。我不明白同一个类的主方法和其他类的主方法有什么不同。 以下是课程:

SingleTonClass.java

public class SingleTonClass {

    private static SingleTonClass obj = null;

    private SingleTonClass() {
        System.out.println("Private Constructor is called");
    }

    public static SingleTonClass CreateObj() {
        if (obj == null) {
            obj = new SingleTonClass();
        }
        return obj;
    }

    public void display() {
        System.out.println("The Ojecte creation complete");
    }

    public void display1() {
        System.out.println("The second obj creation is comeplete");
    }

    public static void main(String[] args) {
        SingleTonClass stc = new SingleTonClass();
        SingleTonClass stc1 = new SingleTonClass();
        SingleTonClass stc2 = new SingleTonClass();
        // stc.display();
        // stc1.display1();

    }
}
public class SingleTonClassTest {

    public static void main(String[] args) {
        SingleTonClass stc=SingleTonClass.CreateObj();
        SingleTonClass stc1=SingleTonClass.CreateObj();
        SingleTonClass stc2=SingleTonClass.CreateObj();
    }
}
SingleTonClassTest.java

public class SingleTonClass {

    private static SingleTonClass obj = null;

    private SingleTonClass() {
        System.out.println("Private Constructor is called");
    }

    public static SingleTonClass CreateObj() {
        if (obj == null) {
            obj = new SingleTonClass();
        }
        return obj;
    }

    public void display() {
        System.out.println("The Ojecte creation complete");
    }

    public void display1() {
        System.out.println("The second obj creation is comeplete");
    }

    public static void main(String[] args) {
        SingleTonClass stc = new SingleTonClass();
        SingleTonClass stc1 = new SingleTonClass();
        SingleTonClass stc2 = new SingleTonClass();
        // stc.display();
        // stc1.display1();

    }
}
public class SingleTonClassTest {

    public static void main(String[] args) {
        SingleTonClass stc=SingleTonClass.CreateObj();
        SingleTonClass stc1=SingleTonClass.CreateObj();
        SingleTonClass stc2=SingleTonClass.CreateObj();
    }
}

在实现单例模式时使用私有构造函数的全部意义在于,您不应该从类外部调用它,以避免直接创建对象。您正在从类内部调用它。因此,问题就来了


Singleton不是魔术,你需要在你的Singleton中有一个像
getInstance()
这样的方法,这个方法应该确保只有一个实例

在实现单例模式时使用私有构造函数的全部意义在于,您不应该从类外部调用它,以避免直接创建对象。您正在从类内部调用它。因此,问题就来了


Singleton不是魔术,你需要在你的Singleton中有一个像
getInstance()
这样的方法,这个方法应该确保只有一个实例

您不能将singleton类的对象置于类之外,因为构造函数是私有的。
构造函数实例化对象。如果构造函数本身是私有的,那么对象将永远不会在类之外实例化,而可以使用getInstance方法。然后您可以在类之外访问它的特性。

您不能在类之外创建singleton类的对象,因为构造函数是私有的。
构造函数实例化对象。如果构造函数本身是私有的,那么对象将永远不会在类之外实例化,而可以使用getInstance方法。然后您可以在类外访问它的功能。

单例类:我们只能创建该类的一个对象

让我们举一个例子:因为Java中的每一件东西都是对象,所以我给你们一个真实的例子。你有一所房子,里面有锁。这把锁只有一把钥匙,如果任何一个从外面来的人想进入或进入你家里的任何东西,那么他应该拥有那把独一无二的钥匙。意味着此约束仅适用于外部人员。如果有人已经在家里,那么他可以做任何事情,对他没有任何限制

同样,私有构造函数不允许任何人创建该类的第二个对象,但您可以在同一个类中创建多个对象,因为private方法只能由同一个类访问


Singleton是设计模式,在您的代码设计中是这样的,CreateObj()是Singleton类的静态方法,它检查对象是否为null,然后通过调用构造函数创建对象,否则它将返回相同的对象。

Singleton类:我们只能创建此类的一个对象

让我们举一个例子:因为Java中的每一件东西都是对象,所以我给你们一个真实的例子。你有一所房子,里面有锁。这把锁只有一把钥匙,如果任何一个从外面来的人想进入或进入你家里的任何东西,那么他应该拥有那把独一无二的钥匙。意味着此约束仅适用于外部人员。如果有人已经在家里,那么他可以做任何事情,对他没有任何限制

同样,私有构造函数不允许任何人创建该类的第二个对象,但您可以在同一个类中创建多个对象,因为private方法只能由同一个类访问

Singleton是设计模式,在您的代码设计中是这样的,CreateObj()是Singleton类的静态方法,它检查对象是否为null,然后通过调用构造函数创建对象,否则它将返回相同的对象。

而不是执行以下操作:

private static SingleTonClass obj=null;
您应该使用:(很抱歉同时更改了奇怪的类名)

来实例化您的单例的唯一实例

public static Singleton getInstance() {
    return INSTANCE;
}
在此之后,您将不会进行一些神秘的检索,如:

public static SingleTonClass CreateObj()
    {
        if (obj==null)
        {
            obj= new SingleTonClass();
        }
        return obj;
    }
相反,您应该定义检索单例的
getInstance()
方法

public static Singleton getInstance() {
    return INSTANCE;
}
经过这些修改后,您的Singleton类应该如下所示:

public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
        // This is called only once
        System.out.println("Private Constructor is called");
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

    public static void main(String[] args) {

        // Even if you ask 100 times, this will only return the same INSTANCE
        Singleton stc  = Singleton.getInstance();
        Singleton stc1 = Singleton.getInstance();
        Singleton stc2 = Singleton.getInstance();

    }

}
运行它将输出:

调用私有构造函数

到您的cmd或终端

最后,正如@Swapnil已经指出的:
private Singleton(){…}
声明用于指示只有Singleton类本身能够创建实例,这是有意义的,而不是执行
private static final Singleton instance=new Singleton()您可以通过使用枚举常量来存储实例(由@JonK注释)来进一步优化代码。为了进一步阅读,我建议:

干杯。

而不是做:

private static SingleTonClass obj=null;
您应该使用:(很抱歉同时更改了奇怪的类名)

来实例化您的单例的唯一实例

public static Singleton getInstance() {
    return INSTANCE;
}
在此之后,您将不会进行一些神秘的检索,如:

public static SingleTonClass CreateObj()
    {
        if (obj==null)
        {
            obj= new SingleTonClass();
        }
        return obj;
    }
相反,您应该定义检索单例的
getInstance()
方法

public static Singleton getInstance() {
    return INSTANCE;
}
经过这些修改后,您的Singleton类应该如下所示:

public class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
        // This is called only once
        System.out.println("Private Constructor is called");
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

    public static void main(String[] args) {

        // Even if you ask 100 times, this will only return the same INSTANCE
        Singleton stc  = Singleton.getInstance();
        Singleton stc1 = Singleton.getInstance();
        Singleton stc2 = Singleton.getInstance();

    }

}
运行它将输出:

调用私有构造函数

到您的cmd或终端

最后一点,正如@Swapnil已经指出的:
private Singleton(){…}
声明用于指示只有Singleton类本身能够创建实例,这是有意义的,而不是执行
private static fin