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

kar*_*kar 4 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); 
    }
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 8

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

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

  • 这绕过了可能在setter中设置的所有验证规则,因此您必须非常谨慎.每次只使用setter更安全(如果将来可能添加验证规则,这将导致您在构造函数中有2个样式).或者,您可以在实施setter时更改它,取决于该方面的首选项. (2认同)

Ósc*_*pez 5

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

this.foreName = foreName;
this.surName = surName;
Run Code Online (Sandbox Code Playgroud)

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

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

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