2012-11-02 96 views
2

什麼,以確保一個init方法是Java調用的好方法嗎?我看到的替代品的Java init方法

  • 不要測試了,如果讓方法初始化的方法本身出現故障,很可能是由NullPointerException
  • 測試或拋出
public void foo() { 
    if (!inited) { 
     throw new IllegalArgumentException("not initalized"); 
    } 
    ... 
} 
  • Delagate
public void foo() { 
    if (!inited) { 
     throw new IllegalArgumentException("not initalized"); 
    } 
    fooInternal(); 
} 

private void fooInternal(){ ... }; 
  • 總是初始化,使初始化一個空操作,否則
public void foo() { 
    init(); 
    ... 
} 
public void init() { 
    if(!inited) { 
     ... 
    } 
} 
  • 默默的init
public void foo() { 
    if (!inited) { 
     init(); 
    } 
    ... 
} 

大多數這些方法都非常冗長,降低整體可讀性。

+0

是什麼'的init()'實際上呢?是否需要爲每個類的每個實例調用它或每個應用程序調用一次?你不能把相關的代碼放到類的構造函數中嗎? –

+0

好問題,我想一個'INIT-once'類型的行爲 –

+0

您可以使用一個靜態初始化塊對一個類進行一次初始化。 –

回答

5

如果初始化是使用合同扔IllegalStateException的一部分,因爲類的客戶端並沒有引起它過渡到正確的「初始化」狀態......

無論您初始化在創建或不依賴於它如何被使用。舉例來說,如果一個可能性是,可以使用Spring的ApplicationContext那麼你會希望推遲初始化。

2

調用init();如果是初始化塊,那麼每個構造函數調用也將執行init();

2

大多數時候,你想fail fast因此選擇,可以幫助你快速失敗根據您的應用程序在執行容器的機制的時間。對於e.g如果Web容器那麼可能是你創造的servlet context期間初始化。而且,我不確定爲什麼下面是冗長的。它的意圖簡單明瞭,明確。

public void foo() { 
    if (!inited) { 
     init(); 
    } 
    ... 
}