1. 程式人生 > >JAVA靜態變數的使用

JAVA靜態變數的使用

很多的地方建議把一個一個不變的變數使用static表明,然後所有的變數字母都是用大寫來表示。

這樣的優點

  1.     是在讀程式碼的時候我們知道這個字母代表什麼,
  2.     當這個字母變化的時候,我們只需要修改一個地方就可以修改所有地方了
public static String GENDER_MAN = "M".

if (GENDER_MAN.equals(gender)){
 ...
}

大量的這種變數存在於程式碼裡面,我們看到其實也是符合程式碼規範的。但是有一次寫程式碼的時候就是覺得這樣的程式碼不“美”。但是也不知道什麼原因。而且不願意寫出大量的static程式碼。

(有的人可以用列舉來代替,個人覺得用列舉是比靜態變數更好,但是實質上並沒有改變,也已經進步不小了。)

後來自己思索以後進行了如下的重構。

public boolean isGenderMan(gender){
    return "M".equals(gender)
}

然後進行code review的時候大家開始表示,你這怎麼行。M出現在程式碼裡面的,hard code啊。好吧,我們來看看到底哪種寫法更好。更加符合之前說的設計模式原則。

使用static 的好處有兩個。上面已經說了。那麼我們來看一下,這樣寫程式碼是不是已經有原來的優點了。

  1. 通過方法名字,我們可以看出M代表男性。而且M不對外開放。別的地方不能使用M。
  2. 如果以後M變成其他的字母的話,也只需要修改一個地方。 

那麼我們看看這麼寫還有沒有其他的好處,如果以後m也代表男性。之前的程式碼怎麼辦。我們需要在程式碼的每一處做出如下修改。

public static String GENDER_MAN = "M".
public static String GENDER_MAN1 = "m".

if (GENDER_MAN.equals(gender) || GENDER_MAN1 .equals(gender)){
 ...
}
那麼第二種方式,只需要修改一個地方就可以了。這樣其實更負責“開閉原則”。但是“守舊的人還是會指責你,M m是硬編碼。”
public boolean isGenderMan(gender){
    return "M".equals(gender) || "m".equals(gender)
}

還有沒有其他的優點,就是我覺得這樣的程式碼更“美”。為什麼美,我也說不出來。我就是覺得這樣漂亮,比程式碼裡面一堆常常的靜態變數好看的多。

有的人說了,我們系統就是不會變,我們的性別只需要使用M,你這是在強詞奪理。我覺得吧,對修改開發是一個大的原則,我們在code的時候需要考慮進去。但是需要做個平衡,也不是一味的說所有都要去修改,需要看代價。代價大了就沒有必要了。如果只是把靜態變數修改成方法的話,其實這樣修改程式碼量不大。而且更負責“開閉原則”。

靜態變數應該使用在什麼地方呢?更加推薦表示一些真正不變的東西,比如說π,空字串我覺得也可以使用(當然程式碼裡面出現“”完全沒有問題。)。或者使用jdk裡面的一些東西。

其實寫程式碼並沒有什麼大的規則,遵循你的“道”就是好的。對於前人的經驗理解後再去使用。