2012-04-10 81 views
4

首先,這不是Initialize final variable before constructor in Java的確切副本。這可能是相關的,但沒有任何答案能令我滿意。最終變量賦值:在聲明還是在構造函數中?

我的問題是關於Swing GUI中的最終變量。這是關於自定義Action特別是。 我有一些final變量和一些static final變量。

問題是:如果變量實際上是一個常量,那麼最好是:在施工時初始化它們,還是在聲明中初始化它們?

我上面提到的問題的答案一般指向在您聲明它時能夠分配變量static。這對我來說並沒有什麼意義,因爲這些變量並未在靜態上下文中使用。我有一些圖像,我的表單使用像圖標,我使這些靜態,因爲圖像只是一個靜態的東西,除非你的應用程序修改它們。這就說得通了。

另一方面,Action是自定義內部類的新實例。從技術上講,它們也是靜態的,但它只是感覺不同。他們只是不可以在靜態上下文中可用。所以我把:

private final CustomAction customAction = new CustomAction(); 

或者我初始化它在構造函數?哪個更好?或者我在想關於static的錯誤方法?

+0

+1提前做好您的研究 – 2012-04-10 17:44:46

+1

如果您在代碼中聲明初始化時知道​​值。其他在建設。 – titogeo 2012-04-10 17:50:02

回答

5

如果該字段是一個常數,使其成爲一流的static final成員,

public class Foo{ 
    public static final int BAR = ...; 
} 

否則,在構造函數初始化場。

+1

你是第_個人說的,儘管沒有人曾經說過爲什麼,或者說這種方法是合理的。 – MarioDS 2012-04-10 17:43:28

+1

@MarioDeSchaepmeester,請參閱[this](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html)。 – mre 2012-04-10 17:45:34

+4

@MarioDeSchaepmeester如果它是不變的,爲什麼每次調用構造函數時都要重新初始化它?有充分的理由,並且發佈的鏈接是一個好的開始。 – darrengorman 2012-04-10 17:46:56

1

聲明時初始化常量變量:它更具可讀性。如果爲類的不同實例設置不同的值,也就是說,如果它是一個類級別變量而不是實例級別,那麼將其設置爲靜態。

0

對於用戶可能不訪問的快速應用程序啓動和程序部件(關於對話框),靜態不好。一般來說,靜態並不是很受歡迎,因爲你已經發現了。有一些原因,但沒有什麼令人信服的。但有時它是一種反模式或標誌。

仍然在你的情況下,我會避免靜態圖像。順便資源被內部緩存。

+1

這相當混亂......如果您的應用程序需要一組在應用程序運行時保持不變的圖像(例如,如果我的應用程序中出現了幾次但其按鈕中包含所有相同圖標的工具欄),爲什麼不靜態加載它們? – CodeBlind 2012-04-10 18:00:31

+0

立即可見的工具欄,是的。當然,無論是創建靜態還是創建工具欄,這都沒有什麼不同。 – 2012-04-10 19:50:22

1

我認爲你是在正確的軌道上,而不是靜態的,因爲它聽起來像你的CustomAction對象是真正自定義GUI的實例,在它的構造函數中創建它們。我認爲是否在構造函數中初始化它取決於構造函數是否可以根據構造函數的輸入參數對CustomAction進行不同的初始化。

其中static與非靜態有關......一個很好的經驗法則是,如果一個變量將在特定對象類型的所有實例中保持不變,那麼該變量應該是static。這個在你的程序運行時節省內存,並且當每個對象實例被構造時節省CPU時間,因爲每次創建對象的新實例時,該常量不必被初始化。另一方面,如果一個變量對於一個Object的特定實例保持不變,但可能與實例不同,那麼它不應該是靜態的。

最後(雙關意圖),final應該使用,只要你不想原始值或引用一個對象永遠不會改變。靜態或非靜態上下文並不真正影響變量是否應爲final,因爲開發人員不想更改該變量,所以它嚴格爲final。它的靜態上下文完全取決於開發者希望如何訪問它。

相關問題