繁体   English   中英

我可以在构造函数中调用set方法吗?

[英]Can I call a set Method inside a Constructor

我有许多set方法设置并使用构造函数来启动它们的值,如下所示。 它正在工作,但我担心它是否是一个普通的Java约定(在构造函数中调用set方法是否正常?)。

我能想到的替代方法是调用一个空构造函数并在main方法中逐个调用set方法来设置值。 我觉得这第二种方法很乏味。 如果我在Java惯例中做得很好/或者有更好的方法,请提供建议。 请告诉我是否需要发布更多代码以使我的问题更清晰。 如果它更有意义,我可以发布所有内容。 谢谢。

public Person(String foreName,String surName, int age, double height, String gender){
        personCount++; 
        setForeName(foreName);
        setSurName(surName);
        setAge(age);
        setHeight(height);
        setGender(gender); 
    }

如果使用this不绕过的制定者定义的验证规则,它只是一个品味的问题:

public Person(String foreName,String surName, int age, double height, String gender){
    personCount++; 
    this.foreName = foreName;
    //same goes for the rest of the params
}

这不仅仅是品味问题。 如果setXXX()方法中没有任何额外的逻辑,则约定是直接在构造函数中分配属性:

this.foreName = foreName;
this.surName = surName;

... 等等。 但是,如果多余的逻辑中setXXX()方法,那么你应该根据需要使用它们。 比如,对日志记录逻辑或类似的调用:

public void setForeName(String pForeName) {
    log.info("setting new foreName value: " + pForeName);
    this.foreName = pForeName;
}

看看setForeName()的最后一行与执行直接赋值是一样的吗? 另请注意,调用setXXX()可能会在性能上花费非常非常小的成本(最有可能被JIT编译器优化掉)。 在正常情况下,您应该优化可读性和清晰度,并且恕我直言,使用此处的直接分配是首选方案。

请记住,setter是公开的,这意味着它可以被子类覆盖。 当你创建一个子类来修改它的一个setter的行为时,它将在子类的construtor中做的第一件事是调用它的超类'构造函数,这意味着这些setter和它内部添加的逻辑实际上你实际上想要修改其中一个setter的行为时将被执行。 这种问题往往很难被发现

来自Effective Java Item 17的引用

构造函数不得直接或间接调用可覆盖的方法。 如果违反此规则,将导致程序失败。 超类构造函数在子类构造函数之前运行,因此在子类构造函数运行之前将调用子类中的重写方法。 如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。

在构造函数中使用set方法非常好。 我不知道用this.var = var来实现它是否真的是一种惯例,但它没关系。

我在构造函数中调用setter时没有看到任何问题。 实际上,如果您计划让setter携带额外的逻辑,使用该方法可以为您提供更好的封装。

你为什么在构造函数中调用set方法? 尝试这个

private String foreName;
private String surName;
private int age;
private double height;
private String gender


public Person(String foreName,String surName, int age, double height, String gender){
        personCount++; 
        this.foreName = foreName;
        this.surName = surName;
        this.age = age;
        this.height = height;
        this.gender = gender; 
    }

/// setter and getter methods of above private variables..

到目前为止,我被教导要做的是在构造函数中提供setter和getter,然后实际设置并在任何方法(在你的情况下为main)中使用它来获取它。 但是,如果您的字段是私有的话。 如果它们像你的情况一样是公开的,那么我会说你在字段或构造函数中设置变量,然后在你想要使用它们的地方调用它们会更有意义......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM