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