什么是MySingleTon st = MySingleTon.getInstance();这段代码意味着什么?

时间:2014-02-21 18:04:01

标签: java

今天我正在阅读一个示例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();实际上做了什么?

4 个答案:

答案 0 :(得分:1)

这就是单例模式,这意味着你只对对象实例一次。

这意味着:

  1. 你有私有变量来保存类实例。

  2. 您不使用构造函数来创建实例,而是使用静态方法初始化实例。

  3. 在getInstance内部,首先检查实例是否已初始化。如果是返回它。

  4. 在维基百科上阅读更多内容,为您提供有关模式http://en.wikipedia.org/wiki/Singleton_pattern

    的更多详细信息

答案 1 :(得分:1)

  

所以应该把它写成新的MySingleton。

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

  

那么什么是MySingleTon.getInstance();实际上在做什么?

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

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

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

enum Singleton {
    INSTANCE;
}

答案 2 :(得分:1)

这是Singleton模式。

由于构造函数是私有的,因此不允许构造new MySingleton。此模式确保您可以创建此类的多个实例,但始终通过调用getInstance()来检索先前生成的实例。

实例存储为static变量,这意味着:一次构建,它将一直存在,直到应用程序关闭。

它通常用于存储您需要反复访问的应用程序配置属性。

答案 3 :(得分:1)

getInstance()并不总是创建新对象。 myObjstatic成员,属于整个班级,而不属于MySingleTon的每个“实例”。因此,第一次调用getInstance()时,由于myObjnull,因此会创建一个新实例。但是第二次及以后的时间myObj将不为空,因此getInstance返回对先前对象的引用。结果是只创建了MySingleTon的一个实例。

程序无法调用new MySingleTon(),因为构造函数已声明为private,这使得它在MySingleTon类之外不可见。

(P.S。“singleton”是一个单词,所以拼写它SingleTon是非常不正确的,除非你打算写一个2000磅代码的类: - )