Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数使用参数调用构造函数_Java - Fatal编程技术网

Java 构造函数使用参数调用构造函数

Java 构造函数使用参数调用构造函数,java,Java,我需要一个有两个构造函数的类,一个带参数,一个不带参数。没有参数的一个应该使用随机参数调用另一个,因此不是默认参数 以下是一些示例代码: public Human(int ageIn, String nameIn){ this.name = nameIn; this.age = ageIn; } public Human(){ String[] names = {"Peter", "Olof", "Alva", "Sanna", "Carl", "Illona"};

我需要一个有两个构造函数的类,一个带参数,一个不带参数。没有参数的一个应该使用随机参数调用另一个,因此不是默认参数

以下是一些示例代码:

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()
必须在构造函数的开头,但我必须定义并弄清楚
name
age
,然后才能调用第一个构造函数


有什么办法吗?

像这样的怎么样

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

像这样的怎么样

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

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

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

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

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

不要混淆忧虑。
人类
不应该关心根据预定义的姓名集选择随机姓名,也不应该计算随机年龄


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

中,不要混淆关注点。
人类
不应该关心根据预定义的姓名集选择随机姓名,也不应该计算随机年龄


我宁愿删除无参数构造函数(除非您为一个名称和一个年龄定义了一个值,但似乎不是您的情况),并在
Human
之外提取此逻辑,通常在
HumanFactory

中,或者您可以创建一个用于创建“随机”的
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);
    }

}
这将使你的构造器远离那些本来不应该在那里的东西。 在您的代码中,随机为其字段赋值的默认构造函数可能会意外调用,并创建不需要的结果


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

或者,您可以创建一个“随机”的工厂方法来创建一个“随机”的人:

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

}
这将使你的构造器远离那些本来不应该在那里的东西。 在您的代码中,随机为其字段赋值的默认构造函数可能会意外调用,并创建不需要的结果


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

我不知道是否有更好的方法,但您可以为每个随机参数创建一个静态方法,然后调用
this(getRandomAge(),getRandomName())
是的,我尝试过这个,static是缺少的关键字,因为它抱怨类未初始化。非常感谢。我不知道是否有更好的方法,但是你可以为每个随机参数创建一个静态方法,然后调用
this(getRandomAge(),getRandomName())
是的,我试过了,static是缺少的关键字,因为它抱怨类未初始化。非常感谢。将此作为答案发布,我会接受。我刚刚看到@ajperez在评论中也这么说。这是正确的答案:)我刚刚看到@ajperez在评论中也这么说。这是正确的答案:)@Tom的确,我完全错过了那一次。然而,这听起来像是一个非常奇怪的规范,所以我无法真正决定我的新建议是否满足它。@Tom的确,我完全错过了那个。然而,这听起来像是一个非常奇怪的规范,所以我真的无法决定我的新建议是否满足它。。