在我的Java程序中,我试图确保仅创建“ ATM”类的一个对象。为此,我有一个经典的单例课程,如下所示:
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
如何确保仅制造ATM类的一个对象?例如。现在将代码放在哪里:
ATM theATM = new ATM();
此代码是属于Singleton类还是属于ATM类?
最佳答案
您不需要该Singleton
类,因为您的单身必须是ATM
。
因此,只需在ATM.java中使用它:
public class ATM {
private static ATM uniqueInstance;
private ATM() {}
public static ATM getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new ATM();
}
return uniqueInstance;
}
}
现在,您可以拨打电话:
ATM theATM = new ATM();
仅当您位于
ATM
类本身中时(因为您的构造函数是private
),但这是没有用的,因为您在这种情况下关心uniqueInstance
。如果您在其他班级,则应使用:
public class Main {
public static void main(String[] args) {
ATM theATM = ATM.getInstance();
}
}
单例模式的想法是,即使再次运行
ATM.getInstance();
,也将返回相同的(初始)实例(uniqueInstance
)。如果之前未初始化,则将其初始化。否则,将返回旧实例。因此,这是确保没有多个实例的方式。当然,有更好的单例模式实现是线程安全的。
例如。:
线程安全-懒惰:
public class ATM {
private static ATM uniqueInstance = null;
private ATM(){}
public static synchronized ATM getInstance() {
if ( uniqueInstance == null ) {
uniqueInstance = new ATM();
}
return uniqueInstance;
}
}
线程安全-渴望
public class ATM {
private static ATM uniqueInstance = new ATM();
private ATM(){}
public static ATM getInstance() {
return uniqueInstance;
}
}
线程安全-使用枚举
public enum ATM {
UNIQUE_INSTANCE;
...
}