[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