Instance Initializer Block & Static Initializer Block

■コレクションの初期化
Static Initializer でなく Instance Initializer を使用すべし。
Javaでstatic finalな配列をpublicで公開すると要素が書き換えられてまう。

×public static final String VALUES = {"val1", "val2"};

コピーを返せないようにすべきで、不変(イミュータブル)でないオブジェクトをstatic finalで公開するのは、多くの場合NG!

○private static final String VALUES = {"val1", "val2"};
 public static String[] getValues() {
  return VALUES.clone();
 }


Javaの言語仕様上、配列要素の参照を不変に出来ないため、仕方なくコピーを返す
というイディオム。

目的がコピー編集再利用ならヨイが
コピーして返すのでヨイんなら↓みたくStatic Initializerで不変化すべし。

※Static Initializer
 Staticブロックでクラスロード時にクラスがロックされるためスレッドセーフなもの。

public static final List LIST;
static {
List tmp = new LinkedList();
tmp.add("要素1");
tmp.add("要素2");
LIST = Collections.unmodifiableList(tmp);
}

↑finalの場合、1度しか代入できないため、
tmpを使用してる分、なんか冗長なので、
あまり使われん手だけど
匿名クラスとインスタンスイニシャライザを使うべし↓。

public static final List LIST = Collections.unmodifiableList(new LinkedList(){{
add("要素1");
add("要素2");
}});

通常、
Static Initializerはクラスを初期化する唯一の方法なのに対し、
インスタンスの初期化は、Instance Initializer使わんでも、
コンストラクタで事足りる。
が、
匿名クラスではコンストラクタを記述できないため、
インスタンスイニシャライザを使う。

システム共通の定数リストや定数マップの実装に有効な手。


■インスタンス初期化子
クラスのインスタンス生成時に特定の処理を実装に使うもの。

*クラスの直下( class Hoge { /*ここ*/ } )に「{<処理>;...}」の形式で書く。
*インスタンス生成時「コンストラクタの前」に実行される。
 親クラスのインスタンスイニシャライザ
 →親クラスのコンストラクタ
 →クラスのインスタンスイニシャライザ
 →クラスのコンストラクタ
 の順。
*"this"が利用できる。
 ※Static Initializerでは、使用不可。


■無効なInstance Initializer Block
こんな記述も。。

↓実は無効なコード
------------------------------
HashMap map = new HashMap()
{
 {
  put("item1", "This is item1");
  put("item2", "This is item2");
 }
}
------------------------------
一見Mapオブジェクトのnewで実行されそうなものだけど
ゆわゆるオブジェクト生成時に実行されるイニシャライザブロックではないのだ。
やるなら匿名クラスか普通の別クラスですべし↓
------------------------------
public class Test extends HashMap
{
 {
  put("item1", "This is item1");
  put("item2", "This is item2");
 }
}
------------------------------
↑としとけば きちんとコンストラクタが呼ばれる前に実行される。


ref:
http://d.hatena.ne.jp/cypher256/20080114/p1
http://d.hatena.ne.jp/unageanu/20080118
http://www.xs4all.nl/~kzeil/en/project/java/initializer-block.html
2009-04-17 06:50 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud