我有许多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);
}
答案 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)中使用它来获取它。但是,如果您的字段是私有的话。如果它们像你的情况一样是公开的,那么我会说你在字段或构造函数中设置你的变量,然后在你想要使用它们的地方调用它们会更有意义......