[閒聊] 小心 static field initialize 的時機
剛剛在弄 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
推
06/07 20:09, , 1F
06/07 20:09, 1F
推
06/07 20:41, , 2F
06/07 20:41, 2F
推
06/08 21:25, , 3F
06/08 21:25, 3F