执行附加逻辑的 getter 和 setter

2022-09-01 23:29:40

我有一个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;
    }

}

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

public double getCorrelation() {
    if (a.equals(b)) {
        return 1D;
    } else {
        return correlation;
    }
}

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


答案 1

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

不幸的是,随着时间的流逝,程序员越来越依赖于getter/setters只是底层属性的访问器/赋值器,随着术语POJO的引入,这种趋势变得正式,以识别只有getter和可能的setter作为方法的对象。

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


答案 2

getters和setters中的副作用通常不是一个好主意,因为它通常是意想不到的,并且可能导致棘手的错误。我建议创建一个“correlate()”方法或其他一些在这种情况下不是特别的getter的东西。

希望这有帮助。


推荐