亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單例模式:getInstance() 與傳遞單例對象?

單例模式:getInstance() 與傳遞單例對象?

慕后森 2023-12-13 15:12:24
使用單例模式的正確/最流行的方法是什么?限制數量。調用 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。


查看完整回答
反對 回復 2023-12-13
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

這樣看:您質疑編譯器是否能夠識別靜態最終引用可以編譯為內聯引用。

我猜編譯器會將 getInstance() 轉換為內聯引用。我不太相信編譯器會認識到,當您按值傳遞引用時,您是故意為自己創建額外的工作,并且當您傳遞引用時,它會在堆棧上創建一個額外的引用。

我的猜測是 getInstance() 會更有效。


查看完整回答
反對 回復 2023-12-13
  • 2 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號