WEB+DB PRESS vol.33
特集1,特に第1章は,誰もが読んでほしい.
特集1
オブジェクト指向エンジニア必読 構造化プログラミング入門
10年先も使える知識を身に付ける!
第1章 「きちんとコードを書く」ための大原則……羽生章洋
構造化プログラミング前史
第2章 オブジェクト指向に活かす構造化の知見……黒枝真,羽生章洋
近代構造化技法とは
第3章 「仕事の流れ」「仕事上のルール」をモデル化する……黒枝真,羽生章洋
業務システムの次世代構造化
- 作者: WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2006/06/22
- メディア: 大型本
- クリック: 16回
- この商品を含むブログ (40件) を見る
Foo.class does not initialize class Foo!
Tiger(JDK1.5)からは,
Foo.class
とやっただけでは,static初期化子は実行されないよって話.実際に試してみたけど,本当にそうだった.確実に初期化したければ,「Class.forName()」を使わないとイケナイようだ.
そんな話,聞いてないよ〜.
これまで、クラスリテラル (Foo.class など) を評価するとクラスが初期化されました。5.0 では初期化されません。前の動作に依存するコードは書き直す必要があります。
→Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
(追記)ちょっと誤解されそうなので補足しときますが,Class.forName()しないとstatic初期化子が動かないわけでは無いス.こんな具合にstaticメソッド呼べば,その直前にstatic初期化子は実行される.
public class Main { public static void main(String[] args) { System.out.println(Foo.class); Foo.bar(); } } public class Foo { static { System.out.println("Initialization Foo..."); } public static void bar() { System.out.println("call bar..."); } }
Tigerでの実行結果はこう.
$ java -cp . Main class Foo Initialization Foo... call bar...
static初期化子の実行タイミングがちょっと遅れるだけなので,大局に影響なしっていうか,一種のトリビアですね.せいぜい,ログとか出してたら,出てくるタイミングがズレるくらいだろうか.
むしろ,このタイミングのズレが命取りになるような実装しちゃイカンだろう.
って自分の胸に手を当ててみる.:-D
(さらに追記)どうやら,この件で困っている人もいるようだ(問題となったコードは,まだ追えてない).
→http://weblogs.java.net/blog/mister__m/archive/2006/08/bitten_by_the_c.html
この人,クラスの初期化を明示するRFE*1を上げていたので,せっかくだから投票しといた.もっかしたらJDK7から使えるようになるかも知れない(気の長い話だ).
→Bug ID: JDK-6459208 Add API for initializing a Class and checking if it has been initialized
→Bug ID: JDK-4993813 (reflect) Need a way to force a class to be initialized.
*1:Request For Enhancement