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

时间:2014-02-04 22:03:11

标签: java constructor encapsulation

我有许多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); 
    }

7 个答案:

答案 0 :(得分:8)

如果使用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
}

答案 1 :(得分:5)

这不仅仅是品味问题。如果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编译器优化掉)。在正常情况下,您应该优化可读性和清晰度,并且恕我直言,使用直接分配是首选。

答案 2 :(得分:3)

请记住,setter是公开的,这意味着它可以被子类覆盖。当你创建一个子类来修改它的一个setter的行为时,它将在子类的construtor中做的第一件事是调用它的超类'构造函数,这意味着这些setter和它内部添加的逻辑实际上你实际上想要修改其中一个setter的行为时将被执行。 This kind of problems are often times hard to spot

Effective Java Item 17引用

  

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

答案 3 :(得分:1)

在构造函数中使用set方法非常好。我不知道用this.var = var做这件事真的是一个惯例,但没关系。

答案 4 :(得分:1)

我在构造函数中调用setter时没有看到任何问题。事实上,如果你打算让setter携带额外的逻辑,那么使用这种方法可以提供更好的封装。

答案 5 :(得分:0)

为什么在构造函数中调用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..

答案 6 :(得分:-2)

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