我写了一个程序来从类main中调用一个单例类。我还写了另一个类,我试图为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();
}
}
SingleTonClassTest.java
public class SingleTonClassTest {
public static void main(String[] args) {
SingleTonClass stc=SingleTonClass.CreateObj();
SingleTonClass stc1=SingleTonClass.CreateObj();
SingleTonClass stc2=SingleTonClass.CreateObj();
}
}
答案 0 :(得分:3)
而不是:
private static SingleTonClass obj=null;
您应该使用:(抱歉同时更改您的奇怪类名。)
private static final Singleton INSTANCE = new Singleton();
实例化Singleton的唯一实例。
在那之后,你不会做一些神秘的检索,如:
public static SingleTonClass CreateObj()
{
if (obj==null)
{
obj= new SingleTonClass();
}
return obj;
}
相反,您应该定义getInstance()
方法来检索您的Singleton。
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记录)来进一步优化代码。如需进一步阅读,我建议:singleton pattern in java
干杯。
答案 1 :(得分:2)
在实现单例模式中使用私有构造函数的全部意义在于,您不应该从类外部调用它,以避免直接创建对象。你是从课堂内调用的。因此,问题。
Singleton并不神奇,你需要在你的单例中有一个类似getInstance()
的方法,这个方法应该确保只有一次实例。
答案 2 :(得分:1)
每次获取singleton类的实例时,不是创建Singleton类的新对象。有多种方法可以定义单例类。 这是一种创建线程安全的Singleton类的方法。有关详情,请查看此链接http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples#bill-pugh-singleton
public class BillPughSingleton {
private BillPughSingleton(){}
private static class SingletonHelper{
private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}
public static BillPughSingleton getInstance(){
return SingletonHelper.INSTANCE;
}
}
答案 3 :(得分:0)
Singleton类:我们只能创建此类的一个对象。
让我们举一个例子:因为Java中的每件事都是对象所以我给你一个真实的例子。 你有一所房子,里面有锁。这个锁只有一把钥匙,如果外面的任何一个想要进入或访问你家中的任何东西,那么他应该拥有那个唯一的钥匙。意味着此约束仅适用于局外人。如果有人已经在房子里,那么他可以做任何事情,对他没有任何限制。
同样,私有构造函数不允许任何人创建该类的第二个对象,但是您可以在同一个类中创建多个对象,因为 private 方法只能由同一个类访问。
Singleton是设计模式,在你的代码设计中就是这样,CreateObj()是SingletonClass的静态方法,它检查对象是否为null然后通过调用构造函数创建对象,否则它返回相同的对象。
答案 4 :(得分:-1)
你不能在类之外创建单例类的对象,因为构造函数是私有的。 构造函数实例化对象。如果构造函数本身是私有的,则该对象永远不会在类外部实例化,而是可以使用getInstance方法。那么你可以在课堂外访问它的功能。