getter和setter执行额外的逻辑

eli*_*ocs 22 java pojo

我有一个Java类,它代表两个元素之间的相关性(典型的POJO):

public class Correlation {

    private final String a;
    private final String b;

    private double correlation;

    public Correlation(String a, String b) {
        this.a = a;
        this.b = b;
    }

    public double getCorrelation() {
        return correlation;
    }

    public void setCorrelation(double correlation) {
        this.correlation = correlation;
    }

}
Run Code Online (Sandbox Code Playgroud)

如果a等于b,则遵循正确的相关逻辑,那么相关值应该始终为1.我可以添加改变getter方法的逻辑(忽略a的可能空值的事实):

public double getCorrelation() {
    if (a.equals(b)) {
        return 1D;
    } else {
        return correlation;
    }
}
Run Code Online (Sandbox Code Playgroud)

困扰我的是将此逻辑添加到getter方法,如果我更改方法名称或记录它应该被认为是足够的?

Nic*_*tti 15

早在Java的早期,getter/setter对就被用来识别bean的属性,这是为了能够定义通过计算而不是普通成员变量实现的概念属性.

不幸的是,随着时间的推移,程序员越来越依赖于getter/setter只是访问者/基础属性的变异器,这种趋势通过引入术语POJO来识别只有吸气剂和可能的物体塞特斯作为方法.

另一方面,将执行计算的对象与仅携带数据的对象区分开来是一件好事; 我想你应该决定你想要实现哪种类型.在你的位置我可能会将相关性作为一个额外的构造函数参数并在那里检查它的有效性,而不是在你的getter中.您Correlation不能是计算对象,因为它没有足够的信息来执行任何计算.


cjs*_*hno 6

getter和setter中的副作用通常不是一个好主意,因为它通常不是预期的,并且可能导致棘手的错误.我建议在这种情况下创建一个"correlate()"方法或其他不特别是getter的方法.

希望这可以帮助.