[閒聊] 小心 static field initialize 的時機

看板java作者 (邀怪)時間16年前 (2009/06/07 09:20), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串1/1
剛剛在弄 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
真神奇, 我還真的沒想過程式會有人這樣寫 XD
06/07 20:09, 1F

06/07 20:41, , 2F
又認識了一些新知 :D
06/07 20:41, 2F

06/08 21:25, , 3F
萬歲
06/08 21:25, 3F
文章代碼(AID): #1AAuPqID (java)