單例模式之使用enum列舉資料型別實現
阿新 • • 發佈:2019-01-01
列舉enum和靜態程式碼塊的特性相似,在使用列舉類時,構造方法會被自動呼叫,
也可以應用這個特性實現單例模式。
如上圖,外部只能通過myobject的getResource來獲得resource物件,再沒有其他途徑。package test; public class MyObject { private enum MyEnumSingleton{ INSTANCE; private Resource resource; private MyEnumSingleton(){ resource = new Resource(); } public Resource getResource(){ return resource; } } public static Resource getResource(){ return MyEnumSingleton.INSTANCE.getResource(); } }
因為列舉變數是static final的,所以如果不是定義時宣告,那隻能在構造方法中例項化,並且有且只能例項化一次。
所以保證了resource物件的單例性。
看一段測試程式碼:
import test.MyObject; public class Run { class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(MyObject.getResource().hashCode()); } } } public static void main(String[] args) { Run.MyThread t1 = new Run().new MyThread(); Run.MyThread t2 = new Run().new MyThread(); Run.MyThread t3 = new Run().new MyThread(); t1.start(); t2.start(); t3.start(); } }
zengrenmeigui