簡體   English   中英

這個班級是單身嗎?

[英]Is this class a singleton?

下面列出的類是單身人士嗎? 由於構造函數聲明為public,我可以推斷該類是一個錯誤實現的單例嗎?

public class CreateDevice extends Functionality{

  private static Simulator simulator;
  ConnectionDB connect = ConnectionDB.getInstance();


  public CreateDevice(Simulator simulator){
    this.simulator = simulator;
  }

  private static CreateDevice instance;
  synchronized public static CreateDevice getInstance() {
    if(instance == null){
      instance = new CreateDevice(simulator);
    }       
      return instance;
  }
}

總而言之 - 沒有。 由於構造函數是public ,任何人都可以隨時隨地創建它的新實例。 使構造函數private應解決問題,並將類轉換為單例。

我會說你說這在當前的實現中不是Singleton是正確的。

您需要將構造函數設置為私有(通常是這樣做),或者如果由於遺留原因需要公共構造函數,則應創建一個構造函數來檢查實例是否為null,如果已存在則拋出異常或者通過調用另一個私有構造函數創建它,將其分配給實例,然后返回它。 第一種選擇是可取的,但對於大多數重構過於昂貴的項目而言,其他選項都可行。

你可以把它變成單身,但是你需要找到另一種方法將模擬器注入其中。

在當前實現中,模擬器是在第一次有人調用構造函數時設置的。 該構造函數非常奇怪,因為它設置了一個靜態字段。 它還將立即打開一個連接,與單例實例使用的連接分開。

如果在構造函數至少調用一次之前調用了getInstance()方法,則永遠不會設置模擬器。

要使它成為一個合適的單例,你可以刪除構造函數並添加一個私有的無參數構造函數。 您還需要一個靜態setSimulator()方法來設置靜態字段,並確保在需要與模擬器進行任何其他交互之前調用它。

如果您在單例之間存在依賴關系,我建議您使用Inversion-of-Control模式,其中IoC容器創建服務對象並將它們連接在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM