作者macbuntu (邀怪)
看板java
標題[閒聊] 小心 static field initialize 的時機
時間Sun Jun 7 17:20:51 2009
剛剛在弄 compiler 的時候, 發現 java 對 static field 的 initialization 時機
可能會有潛藏的陷阱. 舉例來說:
class
A {
static int
a = 1;
}
interface B {
static final int
b =
A.a;
}
class C implements B {
static final int
c =
A.a;
}
class Test {
public static void main(String... args) {
C c = new C();
A.a++;
System.out.println(C.
b +","+ C.
c); // 印出來是 2,1
}
}
JLS 裡說 Class 在產生 object instance 的時候, 所有自己的跟 super class 的
static fields 都必須先被 initialized, 但是 interface 並不需要;
interface fields 基本上只會在第一次被用到的時候才被 initialized.
所以上面的 C.c 在 new C() 的時候就被 initialize, 那時 A.a 的值是 1,
而 C implements B 裡的 B.b 卻還沒有被 initialized; 直到 println 時
C.b (就是 B.b) 才第一次被使用到, 這時 A.a 的值已經是 2 了.
實務上這好像不會造成什麼問題, 因為即便是沒有經驗的初學者,
一旦知道 interface field 一定是 static final 的以後,
直覺上就是把它當成 constant 來用, 很少會有狀況想用變數來當成初始值,
所以 initialization 的時機並沒什麼差別.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.90.52
推 kene:真神奇, 我還真的沒想過程式會有人這樣寫 XD 06/07 20:09
推 qrtt1:又認識了一些新知 :D 06/07 20:41
推 PttTime:萬歲 06/08 21:25