在相關程序中,我們經常會用到一些類管理相關資源或者時工具類。這些類有的可以使用單例模式,單例模式確保在同一個class loader里面只有一個實例對象,這樣就可以保證對資源管理的準確性,當然這些話都是我個人理解的,純屬胡說八道。那么大家都知道實現單例模式有五種方式,今天我們單獨說下枚舉實現單例的方式/
獻上代碼:
public enum SourceManagerEnum { SINGLEINSTANCE; PRivate T instance;// T 代表 相應的類型 // JVM 保證這個方法在整個生命周期只調用一次 private SourceManagerEnum() { instance = new T(); } public T getInstance() { return instance; }}然后我們在別的對象里面就可以使用單例了。
T instance = SourceManagerEnum.SINGLEINSTANCE.getInstance();
注意事項,在T類中的構造函數一定要設置成private ,這個大家都明白
最后一點,為什么推薦使用枚舉單例模式,因為這樣可以防止反射攻擊。
Class cl = Class .forName("XXXXX.SingleUtil"); SingleUtil instance1 = (SingleUtil) cl.newInstance(); SingleUtil instance2 = SingleUtil.getInstance(); System.out.println(instance1 == instance2);
這樣一段代碼輸出的結果是什么呢。
因為枚舉在反射的時候就會報錯。。。。。。。。(純屬大霧,還是需要大家自己驗證)
Class cl = Class .forName("XXXX.SingleEnumReflect"); if (cl.isEnum()) { SingleEnumReflect[] ts = (SingleEnumReflect[]) cl .getEnumConstants(); for (SingleEnumReflect singleEnumReflect : ts) { System.out .println(singleEnumReflect.getInstance() == SingleEnumReflect.Instance .getInstance()); } }
SingleEnumReflect 枚舉的代碼如下。猜猜上面輸出什么?
public enum SingleEnumReflect { Instance; private TextFilterTest textFilter; private SingleEnumReflect() { } public TextFilterTest getInstance() { return textFilter; }}
新聞熱點
疑難解答