2

私の豆は以下の通りです

private boolean myBoolean;

public boolean isMyBoolean() {
    return myBoolean;
}

public void setMyBoolean(
        boolean myBoolean) {
    this.myBoolean = myBoolean;
}

上記のブールフィールドにセッターを使用する場合、それを行う効率的な方法は何ですか

setMyBoolean(true);

また

setMyBoolean(Boolean.TRUE);

オートボクシングがうまくいくことは知っていますが、この例では何が効率的な方法なのかわかりません。したがって、私の質問は、効率的なコードを記述するためにどちらを使用する必要があるか、または両方が同等に優れているかです

ティア

4

5 に答える 5

4

最初のものを使用します。より読みやすく。ここではパフォーマンスの問題について心配する必要はありませんが、2 番目の問題は自動ボクシングを伴い、比較的遅くなります (これについても考える必要はありません)。

このような場合にのみコードの可読性を考慮し、プリミティブは常にオブジェクトよりも高速であることを覚えておいてください。

于 2013-09-03T05:52:05.063 に答える
1

私見では

 setMyBoolean(true);

プリミティブは、常にラッパーよりも優先されます。プリミティブを使用できる場合は、いつでも使用します

実行時に、Wrappers Boxing 変換Unboxing 変換を使用すると、実行時に明らかに時間がかかるためです。

あなたの場合

実行時に、ボックス化変換は次のように進行します。

p が type の値である場合boolean、ボックス化変換は p を次のようにクラスと型 Boolean の参照 r に変換します。r.booleanValue() == p

そこでプリミティブを使えば、明らかにその時間を節約できます。

于 2013-09-03T05:51:30.867 に答える
1

理由

boolean boolVar = Boolean.TRUE;

これはJava 5 の機能であり、必要に応じてラッパー オブジェクトをプリミティブな同等物に自動的に変換できます。

あなたが理解できるように、設定は自動ボックス化解除してから設定するよりも高速です...

于 2013-09-03T05:52:24.817 に答える
0

それはどうでもいい事です。コードがコンパイルされる最後の最後に、生成されたバイトコードは、JVM で boolean データ型を使用することになります。

私が言おうとしているのは、コンパイル時に、このような単純なコードが JVM 用に自動的に最適化されるということです。どちらの方法を使用してもかまいません。コンパイラは最終的にこれをバイトコードに変換し、最近の JVM は常にこの種の最適化を行っていることを覚えておいてください。

これに懐疑的である場合は、両方の方法を試して、コードでプロファイラーを使用できます。あなたは驚かれることでしょう。

于 2013-09-03T05:58:24.877 に答える
0

Boolean.TRUEのラッパー オブジェクトですboolean

Sun SDK からのブール クラスの実装:

public final class Boolean ... 
{
    private final boolean value;

    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);
    ...
}

使用する場合setMyBoolean(Boolean.TRUE);:

  1. VM は Boolean オブジェクトを (ヒープに) 作成し、valuetrue に保存します。
  2. 作成したオブジェクトをアンボックスし、最後にプリミティブtrueをに割り当てmybooleanます。

を使用する場合setMyBoolean(true);: 上記からステップ 2 のみが実行されます。したがって、より速く!

于 2013-09-03T06:09:35.653 に答える