2

次の場合のパフォーマンス/信頼性はどうですか:

public class A {
    private SomeObject a = new SomeObject();

    //...

    public void method() {
        a.callSomeMethod();
    }

    //...
}

対:

public class A {
    //...

    public void method() {
        SomeObject a = new SomeObject();
        a.callSomeMethod();
    }

    //...
}

わかりました、テスト容易性の観点から、2 番目の選択肢はあまり良くありません。しかし、パフォーマンスや信頼性についてはどうですか? どちらの道を進むべきでしょうか? オブジェクトをフィールドとして初期化し、それを頻繁に使用するか、必要なたびに初期化しますか?

後で編集: オブジェクトの構築には時間がかかりません。メソッドが多用されています。

4

7 に答える 7

1

はい。パフォーマンスにヒットがあります。最初のシナリオでは、method() に入るたびに SomeObject のオブジェクトが作成されるわけではありません。2 番目のケースでは、method() に入るたびに新しい SomeObject が作成されますが、これは通常は望ましくありません。しかしその一方で、オブジェクトとガベージ コレクション メカニズムの範囲にも注目する必要があります。2 番目のシナリオでは、メソッド呼び出しが戻る/終了するとすぐに、作成されたオブジェクトのスコープも失われます。したがって、ガベージコレクターで使用できます。したがって、メモリが問題である場合は、2 番目のオプションを選択することをお勧めします。つまり、作成するオブジェクトが数百ある場合は、2 番目のオプションを検討することをお勧めします。オプション1の欠点は、親オブジェクト(クラスAのインスタンス)が存在する限り、構成されたすべてのオブジェクトが存続することです。

public class A {
    private SomeObject a1 = new SomeObject();
    private SomeObject a2 = new SomeObject();

    private SomeObject a1000 = new SomeObject();
    //...

    public void method() {
        a.callSomeMethod();
    }

//...

}

上記のコードは、for ループを使用して method() を 1000 回呼び出し、method() が呼び出されるたびにオブジェクトを作成するよりも効率的ではありません。

繰り返しになりますが、これは設計上の問題です。ニーズに基づいて、1 つのオプションが他のオプションより優れています。私が間違っている場合は、親切に修正してください。

于 2013-11-05T13:04:52.550 に答える
1

他の回答でカバーされているので、あまり繰り返しません。Aそれは、との両方の使用と構造に大きく依存しますSomeObject。また、状況に応じて、他のオプションがあります。オブジェクトの作成が問題でSomeObjectあり、呼び出しの回数methodが比較的少ない場合は、遅延初期化を使用するのが理にかなっている可能性があります。

public class A{
   private SomeObject o;

   public void method(){
       if(o == null){
            o = new SomeObject();
       }
       o.callSomeMethod();
   }
}

また、参照を final としてマークすると、パフォーマンスが向上する可能性があります (少なくとも以前は)。

public class A{
       private final SomeObject = new SomeObject();
       ....
}
于 2013-11-05T13:31:43.287 に答える
1

次の場合のパフォーマンス/信頼性はどうですか

それらはまったく異なります。最初のケースaではクラス メンバーであり、2 番目のケースではaのスコープでのみ認識されmethodます。これら 2 つのコードのパフォーマンスを「比較」することがどれほど良いかはわかりません。

ただし、最初のコードのsomeObjectは、 の呼び出しごとに作成されないことに注意してくださいmethod。何度お電話いただいているかわかりませんがmethod、現在の改訂版ではご質問にお答えするのが難しいです。

于 2013-11-05T12:17:40.143 に答える