方式一:
public class Singleton {
private Singleton() {
}
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
一般而言,这种方式见得最多的写法是static final,那么final是否是必须的呢?
多个线程调用静态方法getInstance()时,JVM也只会加载和初始化内部类一次,将静态变量INSTANCE定义不可变的final是否必须?
在wikipedia的页面中,采取的是方式一:Initialization-on-demand holder idiom
Selepas menambah akhir, ia menjadi berubah.
Pendekatan yang lebih baik untuk Singleton ialah menggunakan Enum (lihat Java Berkesan untuk butiran).
Tiada perbezaan Jika
private
diisytiharkan, kelas lain tidak boleh mengaksesnya secara langsung (kecuali untuk refleksi). Jika anda bimbang tentang akses reflektif, gunakanEnum
untuk mencipta singleton seperti yang dinyatakan di atas.