2016-05-02 8 views
2

私はクラスにコンストラクタを追加することで標準的な方法があることを知っています。しかし、オブジェクトスーパークラス(引数なしコンストラクタを持つ)のクラスでは、一時オブジェクトを使用する方が簡単です。そのような行為のために、何らかの側面がありますか?一時オブジェクトを使って配列からArrayListを作成する

import java.util.ArrayList; 
    public class Main { 

     public static void main(String[] args){ 

     // data available in two separated arrays 
     String[] dName = {"Sam","Ben","Joye","Sarah","Tim","Lucy","Jack"} ; 
     int[] dAge= {10,52,53,15,12,60,21}; 

     // Array list to put the data in 
     ArrayList<Person> personList =new ArrayList<Person>(7); 

     for (int i=0;i<dName.length;i++){ 
      Person tempPerson = new Person(); 
      tempPerson.name= dName[i]; 
      tempPerson.age= dAge[i]; 
      personList.add(new Person()); 
      personList.set(i,tempPerson); 
      tempPerson=null; //removes the reference 
     } 

     for (int j=0 ; j<personList.size();j++){ 
      System.out.println(personList.get(j).name+" age is "+personList.get(j).age); 
     } 

     } 
    } 

class Person{ 
    String name; 
    int age; 
} 

出力あなたは多分java8ストリームを利用することが、なぜ難しいあなたの人生を作ることができ

Sam age is 10 
Ben age is 52 
Joye age is 53 
Sarah age is 15 
Tim age is 12 
Lucy age is 60 
Jack age is 21 
+0

なぜあなたは最初に 'new Person()'をリストに追加したのですか?その後ろの 'tempPerson'ですか?また、リファレンスを削除する必要はありません。ループサイクルごとに「フリー」になります。 –

+0

まず、私はあなたの質問を理解していませんでした。 2つの配列からArrayList を自動的に作成しますか?第2に、forループのオブジェクト管理は少し奇妙です。 ArrayListに新しいPerson()を追加してから、tempPersonをnullに設定するのはなぜですか? – pca

+0

はい、あなたはそれが再び構築されてからすべてのループを解放することを意味しました。私は再び更新する前にそれを破壊する方が良いと思った。 – Elgoph

答えて

4

あなたがすべき何もしないステートメントを避ける - 最適化する必要があります

for (int i=0;i<dName.length;i++){ 
     Person tempPerson = new Person(); 
     tempPerson.name= dName[i]; 
     tempPerson.age= dAge[i]; 
     personList.add(tempPerson); 
    } 
  • 最初後で
  • 参照をnullに不要にそれを交換しないために人を追加する必要はありませんが - リストはどのような場合でも一時オブジェクトへの参照を維持します。
  • 代わりの値を直接設定するあなたがセッターを使用したい場合は、Builderパターン実装できセッター(setName()代わりの.name =
  • を使用することができます。

    public Person setName(String aName) { 
        name = aName; 
        return this; 
    } 
    
    :このよう

personList.add(new Person().setName(dName[i]).setAge(dAge[i])); 

は、その後、再び - 2つの値コンストラクタは、おそらくすべての最も簡単になります - そしてスーパークラスのコンストラクタを持っていないことは問題ではありません。

public Person(String aName, int aAge) { 
    name = aName; 
    age = aAge; 
} 
//You can have more than one constructor 
public Person() { 
} 

、その後

personList.add(new Person(dName[i], sAge[i])); 
+0

ありがとう、私はちょうど私が再び初期化する前に、オブジェクト参照を破壊する必要があると思った。私は最初に直接追加しようとしましたが、それは問題でした(他の何かが間違っているように見えます)ので、私は追加して構築する必要があると思ったので、新しい値を設定することができます.. もう一度お返事ありがとうございます – Elgoph

0

そうでもないが、それは新しい何かを追加wouldntの

3

ますPersonのコンストラクタを使用する必要があります。あなたがpersonList.add(new Person())を呼び出してから、あなたがpersonList.set(i, temPerson)を呼び出すので、

personList.add(new Person(dName[i], dAge[i]) 

また、あなたの実装では、あなたが二回必要な仕事をしている:次に、あなたは、forループでただ一つのコールを持っています。 Personクラスにコンストラクタを必要としない場合は、たとえばpersonList.add(tempPerson)の呼び出しで十分です。

+0

もちろんもちろんコンストラクタは便利ですが、一時オブジェクトを使用するほうが少し簡単です。はい.add(および.set(後で必要ありません。ありがとう – Elgoph

関連する問題