2016-11-11 5 views
0

2つのコンストラクタを持つクラスが必要です。 withoutは無作為化された引数で他のものを呼び出すはずですので、デフォルトのものではありません。ここで コンストラクタで引数を指定してコンストラクタを呼び出す

は、いくつかのサンプルコードです:

public Human(int ageIn, String nameIn){ 
    this.name = nameIn; 
    this.age = ageIn; 
} 

public Human(){ 
    String[] names = {"Peter", "Olof", "Alva", "Sanna", "Carl", "Illona"}; 
    double random = Math.random(); 
    int nameIndex = (int)(names.length*random+0.5); 
    String name = names[nameIndex]; 

    random = Math.random(); 
    int age = (int)(100*random+0.5); 

    this(age, name); 
} 

このハードを作る事がthis()は、コンストラクタの先頭でなければならないことですが、私は定義して、私ができる前にnameageを把握する必要があり最初のコンストラクタを呼び出す。

これを回避する手段はありますか?ありがとうございました!

+6

もっと良い方法があるのか​​どうかわかりませんが、ランダムなパラメータごとに静的メソッドを作成し、 'this(getRandomAge()、getRandomName()) 'を呼び出すことができます。 – AJPerez

+1

はい、これを試しました。クラスが初期化されていないことを納得していたので、staticはキーワードがありませんでした。ありがとうございました!これを回答として投稿してください。 –

答えて

2

これらのランダムな値を作る静的メソッドを作成できます。その後、コンストラクタの1行目で次のように呼び出すことができます。

public Human(){ 
    this(getRandomAge(), getRandomName()); 
} 
+0

私はちょうど@ajperezがコメントで同じことを言ったのを見ました。それは正しい答えだった:) –

0

どのようにしたらこのようになりますか?

public class Human { 

    public Human() { 
     this(null, -1); 
    } 

    public Human(String name, int age) { 
     if(name == null) { 
      name = //your random name generation code 
     } 

     if(age == -1) { 
      age = //your random age generation code 
     } 

     this.name = name; 
     this.age = age; 
    } 
} 
+0

* "無しのものは無作為化された引数で他のものを呼び出すはずです" * ... – Tom

+1

@本当に、私は完全にそれを逃した。しかし、非常に奇妙な仕様のように聞こえるので、私の新しい提案がそれを満たすかどうかは本当に決めることができません。 – rorschach

0

Humanは、あらかじめ定義された名前に基づいてランダムな名前を選択したり、ランダムな年齢を計算したりする必要はありません。

名前と年齢の値が定義されている場合を除いて、引数なしのコンストラクタを削除したい場合は、Humanの外部にあるこのロジックを通常HumanFactoryに抽出します。

0

代わりにあなたがHuman「ランダム」を作成するためにfactory methodを作成することができます。

public class MyProgram { 

    public static void main(String[] args) { 

     Human someRandomStranger = Human.createRandomHuman(); 
     //... 
    } 

} 

public class Human { 

    public Human(int ageIn, String nameIn){ 
     this.name = nameIn; 
     this.age = ageIn; 
    } 

    // ... 

    public static Human createRandomHuman(){ 
     String[] names = {"Peter", "Olof", "Alva", "Sanna", "Carl", "Illona"}; 
     double random = Math.random(); 
     int nameIndex = (int)(names.length*random+0.5); 
     String name = names[nameIndex]; 

     random = Math.random(); 
     int age = (int)(100*random+0.5); 

     return new Human(age, name); 
    } 

} 

これが最初の場所であってはならないものから明確なあなたのコンストラクタを続けるだろう。 フィールドに値をランダムに割り当てるデフォルトのコンストラクタは、コード内で誤って呼び出され、不要な結果を作成することがあります。

一方、適切な名前のファクトリメソッドは、そのような間違いを防止し、あなたの意図を明確に伝えるのに役立ちます。

関連する問題