使用單例模式的正確/最流行的方法是什么?限制數量。調用 getInstance() 的次數,最好只調用一次,并在實例化期間將對象傳遞給其他類?class SingletonClass {// Implementataion}class MainClass { private SingletonClass singletonClassObject; public MainClass() { singletonClassObject = SingletonClass.getInstance(); new SomeClass(singletonClassObject).doSomething(); new SomeOtherClass(singletonClassObject).doSomethingElse(); }}class SomeClass { private SingletonClass singletonClassObject; public SomeClass(SingletonClass singletonClassObject) { this.singletonClassObject = singletonClassObject; } public void doSomething() { System.out.println(singletonClassObject.getStuff()); }}class SomeOtherClass { private SingletonClass singletonClassObject; public SomeOtherClass(SingletonClass singletonClassObject) { this.singletonClassObject = singletonClassObject; } public void doSomethingElse() { System.out.println(singletonClassObject.getStuff()); }}不要傳遞單例對象。而是調用獲取每個類中的對象引用并將引用保存為實例變量并在需要的地方使用它。class SingletonClass {// Implementataion}class MainClass { public MainClass() { new SomeClass().doSomething(); new SomeOtherClass().doSomethingElse(); }}class SomeClass { private SingletonClass singletonClassObject; public SomeClass() { singletonClassObject = SingletonClass.getInstance(); } public void doSomething() { System.out.println(singletonClassObject.getStuff()); }}class SomeOtherClass { private SingletonClass singletonClassObject; public SomeOtherClass() { singletonClassObject = SingletonClass.getInstance(); } public void doSomethingElse() { System.out.println(singletonClassObject.getStuff()); }}甚至不要將引用保存為實例變量,而是在需要該對象的任何地方使用 SingletonClass.getInstance() 。class SingletonClass {// Implementataion}class MainClass { public MainClass() { new SomeClass().doSomething(); new SomeOtherClass().doSomethingElse(); }}這些方法在更好的設計、可測試性等方面如何相互比較?哪個更好?為什么?
2 回答

一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
如果我們暫時假設這SingletonClass
不是單例,并且我們沒有通過調用方法獲得實例static
,那么我們將面臨另一個問題,即如何將這些類鏈接在一起。這個問題是通過以下方法解決的Dependency Injection
,這個概念在這里得到了很好的描述:
控制容器反轉和依賴注入模式
單元測試 101:控制反轉
閱讀完上面的內容后,應該很容易選擇.1
所有類都在構造函數中引用所需依賴項的選項。interface
您甚至可以為您需要的行為創建一個并在 中實現它SingletonClass
?,F在你看到了,類實現Singleton模式這一事實并沒有使它變得特別,我們應該像其他類一樣注入它們。使用您帶來的所有好處都DI
可以應用于您的班級。
只需將其與您進行比較.3
,您就需要編寫一個需要模擬某些內容的測試。如果是的話,這將是更令人不愉快的任務.1
。

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
這樣看:您質疑編譯器是否能夠識別靜態最終引用可以編譯為內聯引用。
我猜編譯器會將 getInstance() 轉換為內聯引用。我不太相信編譯器會認識到,當您按值傳遞引用時,您是故意為自己創建額外的工作,并且當您傳遞引用時,它會在堆棧上創建一個額外的引用。
我的猜測是 getInstance() 會更有效。
添加回答
舉報
0/150
提交
取消