在我的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;
    ...
}

10-08 20:13