2014-10-05 119 views
0

我有一個很多靜態變量的classA。Java:將靜態變量傳遞給構造函數?

如果我以靜態方式訪問另一個classB中的這些變量,即通過調用ClassA.variable或者將這些靜態變量傳遞給classB的構造函數(並將其分配給static classB中的變量供以後使用)?你會用哪一個?

+5

_I有一個有很多靜態變量的classA。** **警鐘如果你想編寫可測試代碼,然後把這些'static'變量傳遞給構造函數。如果你想編寫可維護的代碼,儘可能多地去除'static'變量。 '靜'是邪惡的! – 2014-10-05 14:07:12

+1

2個人(包括我自己)已經告訴你,在你的[上一個問題]中使用可變靜態字段是不好的設計(http://stackoverflow.com/questions/26201432/junit-initialization-of-static-fields)。你還需要相信多少呢? – 2014-10-05 14:10:04

+0

您不通過*變量*,通過* values *。這些值來自哪裏沒有區別。 – 2014-10-05 14:23:53

回答

0

複製很多領域將是一個壞主意,因爲它使維護變得複雜。

如果這些字段是真正可變的,而不是常量,那麼您現在在兩個不同的類中具有相同的命名變量。您必須記住在更新其中一個代碼的代碼中的所有位置更新每個值的兩個副本。

即使字段是常量,複製它們混淆了它們的含義和目的。理想情況下,程序中應該只有一個地方定義了這些值,這應該是與他們所做的事情最相關和最有意義的類。

另一個考慮是,ClassA和ClassB有多密切相關?如果您想將這些值作爲參數傳遞的原因是因爲ClassB有時可能希望由不同的類而不是ClassA使用,那麼傳遞參數是有意義的,因爲您無法將引用硬編碼到ClassA中的原始字段。但是如果有很多這樣的參數,那麼它很笨拙。在這種情況下,您可以使用單獨的類來保存類所共享的配置狀態。 ClassA(以及類似它的類)將創建並初始化Configuration類的實例,並將其作爲單個參數傳遞給ClassB。 Configuration類將是唯一需要聲明和記錄多個變量的地方。另一方面,如果你的兩個類是同一個應用程序的兩個不可分割的部分,所以ClassB總是可以指望ClassA在那裏,那麼間接就不是必須的了。然後問題再次變成,你真的想在ClassB中複製這些字段嗎?

如果你真的想是減少的事物面前打字ClassA.,在ClassB的頂部使用靜態導入:

import static packageName.ClassA.*; // imports all static members 
import static packageName.ClassA.fieldX; // imports a specific thing selectively 

那麼你可以參考的東西僅僅作爲field1,而不是ClassA.field1。這種用法令人不悅,因爲它可以很容易地弄清楚變量來自哪裏,但如果有幾個變量正在使用許多次,它可能是一個明確的勝利。