2016-11-11 217 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); 
    } 

} 

这将让您从构造函数的东西,不应该出现在首位清楚。 随机为其字段赋值的默认构造函数可能会在代码中被意外调用并创建不需要的结果。

另一方面,正确命名的工厂方法将有助于防止此类错误并清楚地传达您的意图。