单独的持久字段和派生字段

时间:2011-07-04 11:33:33

标签: java

分离bean的持久性和派生属性有哪些可能性?你认为什么是最好的做法?假设下面的简单示例中spentMoneynumberOfDays是持久属性,avrageSpendingPerDay是派生属性。感谢您对此设计问题的回答。

class Person implements Serializable {
    private BigDecimal spentMoney;
    private int numberOfDays;

    public Person() {
    }

    public BigDecimal getSpentMoney() {
        return spentMoney;
    }

    public void setSpentMoney(BigDecimal spentMoney) {
        this.spentMoney = spentMoney;
    }

    public int getNumberOfDays() {
        return numberOfDays;
    }

    public void setNumberOfDays(int numberOfDays) {
        this.numberOfDays = numberOfDays;
    }

    public BigDecimal getAvrageSpendingPerDay() {
        return spentMoney.divide(new BigDecimal(numberOfDays), 2, RoundingMode.HALF_EVEN);
    }
}

3 个答案:

答案 0 :(得分:2)

您无需将它们分开。这就是封装的全部要点。调用者知道有getAvrageSpendingPerDay方法,但不关心它是否通过持久属性实现。

您可能会改变主意并保持相同的公共方法,但每次调用setSpentMoneysetNumberOfDays时重新计算平均值并将其存储在字段中,而不更改其余代码中的任何内容。这就是为什么使用getter比直接访问公共字段更好。

答案 1 :(得分:0)

我认为您不需要仅考虑某些属性是持久的而其他属性是派生的信息来考虑设计选择。您已经处理了重要的事情,即没有派生属性的成员字段。

答案 2 :(得分:0)

我觉得你有点困惑......序列化坚持FIELDS而不是方法......你的例子中没有avrageSpendingPerDay FIELD。

如果你在那里(只是说)使得花费的money和numberOfDays最后(即只由结构符号设置,之后是不可变的)那么你可以在一个字段中缓存你的getAverageSpendingPerDay方法的结果(在第一次请求时)......和然后你只需将你的“缓存字段”_averageSpendingPerDay标记为transient

干杯。基思。