java将持久字段和派生字段分开
区分bean的持久属性和派生属性的可能性是什么?你认为最好的做法是什么?假设下面的简单示例spentMoney
和numberOfDays
是持久属性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);
}
}
# 1 楼答案
你不需要把它们分开。这就是封装的全部意义。调用者知道有一个
getAvrageSpendingPerDay
方法,但不关心它是否通过持久性属性实现您可能会改变主意,保留相同的公共方法,但每次调用
setSpentMoney
或setNumberOfDays
时,重新计算平均值并将其存储在字段中,而不会更改代码其余部分的任何内容。这就是为什么使用getter比直接访问公共字段更好# 2 楼答案
我觉得你有点困惑。。。序列化保留字段而不是方法。。。在您的示例中没有
avrageSpendingPerDay
字段如果您(只需说)将spentMoney和numberOfDays设置为final(即,仅由构造函数设置,此后不可变),那么您可以将getAverageSpendingPerDay方法的结果缓存在字段中(根据第一次请求)。。。然后你只需将你的“缓存字段”_averageSpendingPerDay标记为
transient
干杯。基思
# 3 楼答案
我不认为你只需要考虑一些属性是持久的,而其他属性是派生的信息就可以进行设计选择。您已经注意到了一件重要的事情,即没有派生属性的成员字段