今天,我正在阅读一个示例Java程序来创建单例类。代码如下:

public class MySingleTon {

private static MySingleTon myObj;
/**
 * Create private constructor
 */
private MySingleTon(){

}
/**
 * Create a static method to get instance.
 */
public static MySingleTon getInstance(){
    if(myObj == null){
        myObj = new MySingleTon();
    }
    return myObj;
}

public void getSomeThing(){
    // do something here
    System.out.println("I am here....");
}

public static void main(String a[]){
    MySingleTon st = MySingleTon.getInstance();
    st.getSomeThing();
}
}


我不明白这段代码MySingleTon st = MySingleTon.getInstance();是什么意思?
我的意思是我们正在通过st创建对象MySingleTon st;因此应该将其写为new MySingleton。那么MySingleTon.getInstance();到底在做什么?

最佳答案

因此应该将其写为新的MySingleton。


如果仅注意到new方法,则仍仅使用getInstance()创建实例。


  那么MySingleTon.getInstance();是什么?到底在做什么?


它调用getInstance()方法,该方法是static类的MySingleton方法。该方法返回MySingleton类的新实例或现有实例(如果已经存在)。基本上,getInstance()是工厂方法。

这就是实现单例模式的方式。如果使用new关键字创建Singleton类的实例,则可以根据需要创建任意多个实例,这使该类成为非单一类。这就是该类的构造函数为private的原因。您可能当前可以调用构造函数,因为您的main方法仅在该类中。尝试将main()方法移动到其他类,这样会更加清楚。

现在遇到那个单身人士的问题。您不应该真的那样那样实现单例。首先,它不是线程安全的。其次,它不是序列化安全的。从某种意义上说,当您序列化和反序列化其实例时,将创建一个新实例。理想情况下,应避免完全使用Singleton,因为这很邪恶。但是无论何时,实现单例模式的最佳方法是使用enum

enum Singleton {
    INSTANCE;
}

关于java - MySingleTon st = MySingleTon.getInstance();是什么?这个代码是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21941883/

10-11 02:35