开发者

Separate persistent and derivated fields [closed]

Closed. This question is opinion-based. It is not currently accepting answers.

Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.

Closed 4 years ago.

开发者_如何学Go Improve this question

what are the possibilities to separate persistent and derivated attributes of bean? And what's the best practice at your opinion? Assume simple example below where spentMoney and numberOfDays are persistent attributes and avrageSpendingPerDay is derivated attribute. Thank you for your answer to this design question.

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);
    }
}


You don't need to separate them. That's the whole point of encapsulation. The caller knows there is a getAvrageSpendingPerDay method, but doesn't care if it's implemented through a persistent attribute or not.

You might change your mind and keep the same public methods, but recompute the average and store it inside a field each time setSpentMoney or setNumberOfDays is called, without changing anything in the rest of the code. That's why using getters is better than accessing public fields directly.


I don't think you need to think about a design choice only with the information that some of the attributes are persistent and others are derived. You have already taken care of the important thing i.e. not having a member-field for derived attributes.


I think you're a tad confused... serialization persists the FIELDS not the methods... and you don't have a avrageSpendingPerDay FIELD in your example.

If you where (just say) to make spentMoney and numberOfDays final (i.e. set only by the contructors, and immutable thereafter) then you COULD cache the result of your getAverageSpendingPerDay method in a field (upon first request)... and then you'd just mark your "cache field" _averageSpendingPerDay as transient.

Cheers. Keith.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜