有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    你不需要把它们分开。这就是封装的全部意义。调用者知道有一个getAvrageSpendingPerDay方法,但不关心它是否通过持久性属性实现

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

  2. # 2 楼答案

    我觉得你有点困惑。。。序列化保留字段而不是方法。。。在您的示例中没有avrageSpendingPerDay字段

    如果您(只需说)将spentMoney和numberOfDays设置为final(即,仅由构造函数设置,此后不可变),那么您可以将getAverageSpendingPerDay方法的结果缓存在字段中(根据第一次请求)。。。然后你只需将你的“缓存字段”_averageSpendingPerDay标记为transient

    干杯。基思

  3. # 3 楼答案

    我不认为你只需要考虑一些属性是持久的,而其他属性是派生的信息就可以进行设计选择。您已经注意到了一件重要的事情,即没有派生属性的成员字段