小心的使用static final

在Java世界中,如果我們有一個常數要設定,一定的習慣,都會使用
 public static final String HELLO_WORLD = "Hello World";


類似的程式碼,充斥在整個專案的程式中,但這樣卻有一個潛在的風險。
若這個常數,被別人使用到(可能不會知道是誰去用到這個常數),後來改了這個常數。
更新.class後,用到這個常數的程式若有透過這個變數做一些判斷的邏輯,就會出問題。

為什麼?

因為Java在complie Java程式的時候,會將public static final的常數值,直接押進程式裡面。

呼叫常數的程式如下:
System.out.println(HELLO_WORLD);

若把complie後的.class反組譯出來看,其結果會變成
System.out.println("Hello World");


所以如果要解決這樣的問題,就是要將要使用的常數,不要一開始就宣告,若是於後面再宣告,
但由於是static final,所以要在static block中去給定常數,不然會有問題。

 public static final String HELLO_WORLD ;

 static {
  HELLO_WORLD = "Hello World";
 }


這樣反組譯出來的結果會是
System.out.println(HELLO_WORLD);


因此若你的程式,不是整包deploy,而是.class一個一個更新的,建議可以用這種方法,以避免日後潛在的風險。

留言

熱門文章