构造函数调用带参数的构造函数

时间:2016-11-11 13:38:27

标签: java

我需要一个带有两个构造函数的类,一个带有一个带有一个带有参数的构造函数。没有的人应该用Randomized参数调用另一个,所以不是默认的。

以下是一些示例代码:

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才能调用第一个构造函数与它们。

有什么方法吗?

4 个答案:

答案 0 :(得分:2)

您可以创建生成这些随机值的静态方法。然后在构造函数的第1行,您可以调用:

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

不要混淆顾虑。 Human不应该关心根据预定义的名称集选择随机名称,也不应该计算随机年龄!

我宁愿删除no-arg构造函数(除非你有一个名称和年龄的定义值,但似乎不是你的情况)并在Human之外提取这个逻辑,通常在HumanFactory

答案 3 :(得分: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);
    }

}

这样可以让你的构造者清楚地知道那些不应该存在的东西。 可能会在您的代码中意外调用随机为其字段分配值的默认构造函数,并创建不需要的结果。

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