今天我正在阅读一个示例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();
实际上做了什么?
答案 0 :(得分:1)
这就是单例模式,这意味着你只对对象实例一次。
这意味着:
你有私有变量来保存类实例。
您不使用构造函数来创建实例,而是使用静态方法初始化实例。
在getInstance内部,首先检查实例是否已初始化。如果是返回它。
在维基百科上阅读更多内容,为您提供有关模式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()
并不总是创建新对象。 myObj
是static
成员,属于整个班级,而不属于MySingleTon
的每个“实例”。因此,第一次调用getInstance()
时,由于myObj
为null
,因此会创建一个新实例。但是第二次及以后的时间myObj
将不为空,因此getInstance
返回对先前对象的引用。结果是只创建了MySingleTon
的一个实例。
程序无法调用new MySingleTon()
,因为构造函数已声明为private
,这使得它在MySingleTon
类之外不可见。
(P.S。“singleton”是一个单词,所以拼写它SingleTon
是非常不正确的,除非你打算写一个2000磅代码的类: - )