[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1770] Re: null クリア



高橋(徹)です。

   ""Tetsuya.T" <had20740@xxxxxxxxxxxxx>"さんは書きました:
> 環境JDK1.3.0_02です。m_strをnullクリアしたときとしないときで
> クラスファイルのサイズが違い、実行時間もNULLクリアが
> あるほうが遅くなりました。以外に差が出てびっくり、
なるほど、デフォルト値と同じ値であってもやはり初期化コードが
生成されているようですね。
非常に単純なクラスを書いて、そのクラスファイルのバイトコードを
見てみました。
public class FieldInitialize {
    private String name;
    private String address = null;

    public FieldInitialize() {
    }
}
これをjavacでコンパイルして、javap -cコマンドで見ると、
$ javap -c FieldInitialize
Compiled from FieldInitialize.java
public class FieldInitialize extends java.lang.Object {
    public FieldInitialize();
}

Method FieldInitialize()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 aload_0
   5 aconst_null
   6 putfield #2 <Field java.lang.String address>
   9 return
$
となりました。
フィールドaddressについては、コンストラクタ(public FieldInitialize())
の中で値nullがセットされているというコードになっています。
つまり、フィールドの宣言文で初期値をセットするコードを記述していると、
Javaバイトコードでは、コンストラクタにおいて代入処理が付け加わるという
ことになります。

> JAVAではnullクリアは使わない方がいいのかもしれません。
大量にフィールドが存在するクラスを大量に生成するときは、
けっこう大きな違いが生まれるかもしれませんね。

---
Toru TAKAHASHI