2012-07-23 159 views
9

私有靜態方法的靜態變量可以與私有靜態方法或用靜塊進行初始化。兩者之間有什麼細微差別?有什麼情況我不能使用靜態方法來初始化靜態成員?我發現後者更具可讀性。靜塊VS靜態成員初始化

靜塊初始化:

private static int NUM_ITER; 
static { 
    // Operations 
    NUM_ITER = //val from above operations. 
} 

私人靜態方法初始化:

private static int NUM_ITER = calculateNumIter(); 

// Some method comment on how we are calculating. 
private static int calculateNumIter() 
{ 
    // Operations. 
    return //value_from_operations. 
} 

我喜歡第二之一,因爲它是更具有可讀性。有什麼情況我只能使用第一個(靜態塊)?

什麼是初始化靜態成員(決賽以及變量)的最佳編碼約定/設計?即使從這個thread我學到私人靜態方法有優勢的靜態塊。

感謝,

+0

自從我使用版本2以來,我已經爲靜態塊遺忘了幾次靜態;)。 – Stefan 2012-07-23 20:34:21

回答

2

靜態塊將是必要的(或至少是有用的),如果兩個不同的變量是interdependant並且不能獨立地初始化。

假設你需要從文件中讀取兩個值,例如。您可以將這兩個值存儲在其他對象中。但是如果你真的需要兩個常量,一個靜態塊是有用的。

+0

因此,這裏靜態方法可以替代靜態塊。 – Mohan 2012-07-23 18:53:47

+0

如果第二個是從第一個派生的,那麼這將起作用。但是,如果兩者都來源於單一的價值,那就不是。例如,假設您需要從文件中讀取兩個值。 – 2012-07-23 18:56:51

+1

是的,但是如果你的第一個靜態方法也接受你的第二個靜態成員爲arg呢? – LastStar007 2012-07-23 18:56:55

1
  1. static Initializer塊(你的選項1)執行時JVM裝載該類,甚至之前任何static變量被初始化。

  2. 它的一個好地方,擁有所有的靜態變量的一次。

  3. 通過將多個參數傳遞給初始化方法的參數,您可以選擇使用第二個選項初始化多個static變量。

+0

在我的示例中,將在JVM初始化期間調用calculateNumIter()。不是嗎? – Mohan 2012-07-23 19:20:53

+0

雅......它會...... – 2012-07-23 19:23:32

2

我會建議使用任何語法保持了代碼乾淨和可讀性:

  • 如果初始化達一個,最多兩個代碼非常簡單的線條,然後用靜態塊去;

  • 如果初始化是一個複雜的操作,那麼一個好名字將是最好的方法;

  • 有疑問,請使用方法語法並使用方法名來聲明不僅是哪個變量,而且還要聲明如何初始化(即initializeValueWithRandomNumber());