2011-07-28 3 views
5

オブジェクトを繰り返し使用する場合は、データをnullに設定してクリアするか、新しいオブジェクトをインスタンス化する方が良いでしょうか?私はJavaパフォーマンス:オブジェクトを消去するときは、nullに設定するか新しいオブジェクトを作成する方が良いでしょう。

a = new Customer(); 

これを行うための最善の方法であるか、それが行われるべきかどうか迷っています

Customer a = new Customer(); 
Collection<Customer> data = new ArrayList<Customer>(); 

     while (rs != null && rs.next()) { 
      a = new Customer(); 
      a.setCustId(rs.getLong("CUST_ID")); 
      a.setPerNo(period); 
      a.setName(rs.getString("cust_nm")); 

      if(a!= null) 
       data.add(a); 
     } 

:ここ

Object a = new Object(); 
    for(...){ 
     ... 
     a = null; 
     **OR** 
     a = new Object(); 
    } 

は、私が参照しています例ですそれぞれのループが新しい顧客情報を持っているので、メモリを節約し、最適なパフォーマンスを得るために、別の方法で、新しい顧客を作成して新しいオブジェクトを指しています。したがって、古いオブジェクトaが指し示していたオブジェクトは、ガベージコレクタによって取得されます。これはnullに設定した場合と同じです。これは正しい理解ですか?

+0

結果セットの各行に対して新しい顧客を作成する必要があります。そうしないと、結果セット内の行と同じ回数だけリスト内の同じオブジェクトになります結果セットの最後の行 また、ヌルチェックは不要です。「a」はnullにできません。 –

+1

'a.setName'と' if(a!= null) 'の間に何かが起こっていない限り、' if(a!= null) 'テストは完全に冗長です。それは常に*通過するでしょう。 – CPerkins

答えて

14

私が希望:

for (...) { 
    Object a = new Object(); 
    ... 
} 

は、なぜそれが必要以上に任意のより大きな範囲を作りますか?

同様に、I が新しいオブジェクトを必要としない限り、私はそれを目的に作成しません。

より完全で実例を挙げることができれば、より具体的な推奨をすることができます。

は(あなたは、繰り返し繰り返し変数を使用するのとそんなにオブジェクトを使用する兆候がないことに注意してください彼らは非常に異なる概念だ。。)

EDIT:あなたの具体的な例を見てみると - あなたの元のコードが作成するのに対し、これはガベージコレクションの対象となります任意のCustomerオブジェクトを作成していないこと

Collection<Customer> data = new ArrayList<Customer>(); 

while (rs != null && rs.next()) { 
    Customer a = new Customer(); 
    a.setCustId(rs.getLong("CUST_ID")); 
    a.setPerNo(period); 
    a.setName(rs.getString("cust_nm")); 

    data.add(a); 
} 

注:、私はこのようにそれを記述しますループに入る前にCustomerのインスタンスを作成し、新しく作成したオブジェクトを無視して新しいオブジェクトを作成し、aの値を再割り当てします。

+0

私は何を言っているのかを明確にするために私の質問を編集しました。私は誤解かもしれませんが、あなたの提案はどのように効率的になりますか?オブジェクトを定義して新しいオブジェクトとしてインスタンス化するので、ループするたびに既存のオブジェクトを変更する代わりに新しいオブジェクトが作成されるように、オブジェクトを定義すると理解しました。 - 助けてくれてありがとう。 –

+0

@ブラッド:あなたは*オブジェクト* 'a'を定義しておらず、変数* aを宣言しています。それは効率の問題ではありません - それは* neaterコード*の問題です。効率の観点からは、変数をループの内部または外部に宣言するかどうかは関係ありません。 –

6

必要な場所でオブジェクトをインスタンス化します。あなたがいない場所ではない。プロファイラがあなたに指示するまでこのレベルの最適化について心配しないでください。

編集:あなたの更新された答えが与えられれば、Jonが推奨するように、変数を宣言してループ内にCustomerオブジェクトをインスタンス化することは、読者には明らかです。パフォーマンスとガベージコレクションの質問については、improve your grasp of the basic language conceptsが必要です。

+0

これははるかに良い答えです。 – Joseph

1

明示的にNULL参照は、オブジェクトを参照することを明示的に「停止」し、そうしないと実際のメモリリークを招く特別な場合に必要です。例として、使用されなくなった参照/オブジェクトを指すのを避けるために配列配列NULLが配列されたList実装の配列を見ることができます。

1

あなたの混乱は、オブジェクトが参照渡しされたことを理解していないことに起因すると思います。あなたはCの背景から来ている場合は、あなたが実際にあなたがあなたのリストに追加し、それぞれの顧客のための新しいメモリを必要とするので、Javaで、Customer a = new Customer();は、実際に、あなたは新しいCustomerオブジェクトを作成

Customer* a = (Customer*) malloc (sizeof(Customer)); 
initializeCustomer (a); //the constructor initializes the state of the object. 

のようなものを避けることができないないことを理解しますループの反復ごとに

関連する問題