在我的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();
此代码是属于单例类还是属于ATM类?
答案 0 :(得分:3)
您不需要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
)。如果之前没有初始化,则初始化。否则,返回旧实例。因此,这就是您确定不会有多个实例的方式。
当然,单线程模式的更好实现是线程安全的。
E.g:
线程安全 - 懒惰:
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;
...
}