作者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
1F:推 kene:真神奇, 我还真的没想过程式会有人这样写 XD 06/07 20:09
2F:推 qrtt1:又认识了一些新知 :D 06/07 20:41
3F:推 PttTime:万岁 06/08 21:25