2016-11-11 219 views
0

我需要有一個具有兩個構造函數的類,其中一個具有而另一個不具有參數。沒有的應該用隨機參數來調用另一個,所以不是默認值。構造函數調用具有參數的構造函數

下面是一些示例代碼:

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

我不知道是否有更好的方法,但你可以只爲每個隨機參數靜態方法,並調用'這個(getRandomAge(),getRandomName())' – AJPerez

+1

是的,我想這一點,和靜態是缺少的關鍵字,因爲它正在抱怨該類未初始化。謝謝!發佈這個答案,我會接受。 –

回答

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

@Tom確實,我完全錯過了那一個。然而,這聽起來像是一個非常奇怪的規格,所以我不能真正決定我的新建議是否滿足它。 – rorschach

0

不要混淆顧慮。 A Human不應該關心根據預定義的一組名稱來選擇一個隨機的名字,也不應該計算一個隨機的年齡!

我寧願刪除無參數的構造函數(除非您有一個名稱和年齡的定義值,但它似乎不是您的情況),並提取Human以外的邏輯,通常在HumanFactory

0

或者你可以創建一個factory method創建一個「隨機」 Human

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); 
    } 

} 

這將讓您從構造函數的東西,不應該出現在首位清楚。 隨機爲其字段賦值的默認構造函數可能會在代碼中被意外調用並創建不需要的結果。

另一方面,正確命名的工廠方法將有助於防止此類錯誤並清楚地傳達您的意圖。