在我的构造函数中调用方法是否是一种好的做法?



我有以下类,我想在其中自动生成高级值:

public class MedicalPolicy implements PolicyType {
private int id;
private LocalDate effective;
private LocalDate expiry;
private String policyNo;
private double premium;
private ArrayList<Beneficiary> beneficiaries;
public MedicalPolicy(LocalDate effective,LocalDate expiry,ArrayList<Beneficiary> beneficiaries){
this.id=0;
this.effective=effective;
this.expiry=expiry;
this.beneficiaries=beneficiaries;
this.premium=getPremiumByCalculation();
this.policyNo= Integer.toString(LocalDate.now().getYear()) + "-Medical-" + Integer.toString(id);
}
private double getPremiumByCalculation(){
//do some calculation based on some criteria
}
}

像我一样使用一种方法来计算保费是否是一种好习惯,或者有更好的方法吗?

不,这是一个糟糕的主意

不要对部分构造的对象调用方法。你可能认为你可以计算出它是充分构造的,或者如果你查看代码,你会看到它可能会工作,但其他人将不得不经历推论,然后进行维护。

Swing做了很多,而且一团糟。导致各种NullPointerException

一定要分解一个方法,但不要让它成为同一实例的实例方法。这段代码的一个特殊问题是,看起来premium每次更改都需要更新,这将是非常脆弱的。

这是不行的,因为字段(甚至是最终字段!(可能没有您期望的值。有点先有鸡还是先有蛋的场景:您的方法将假定对象已完全构造,但是,在方法完成之前,不可能完全构造对象。

通常的首选替代方案是静态方法。这避免了整个喧嚣。这确实意味着您必须传入运行此计算所需的实际信息位,但这实际上是一件好事:它使需要哪些信息更清晰,并且更容易测试。

我注意到您的字段不是最终的;我假设确定"溢价"的计算取决于这些非最终字段中的至少一个。在这种情况下,您是否考虑过更新该字段时会发生什么?通常,解决此问题的最简单方法是将所有字段定为最终字段,并使其成为不可变的对象,巧妙地回避"但是如果更新了怎么办?

第二个简单的解决方案是完全删除高级字段并每次重新计算它。如果一切都是数学(指数和日志等的一些乘法和应用(,那么CPU的速度非常快。事实上,CPU 可以在执行单个内存查找所需的时间内执行 300 到 500 条指令(我过于简化,因为相邻字段的内存查找通常来自同一个缓存页面,因此实际上是免费的,但是,嘿,如果它必须首先获取该缓存页面, 一旦我们已经进入了 500 个周期,为什么要担心另外 4 个周期,对吧?也许让这个对象少占用两倍的内存实际上可以节省以后的缓存查找,因此速度更快——没有探查器报告,不要猜测,选择更容易编写的代码,完全摆脱premium听起来会更简单。让每个人都每次都调用getPremiumByComputing(((并将其重命名为getPremium(((。

在我看来,这没有错。您可以测试它是否适用于简单的 JUnit 文件,但如果可以,请继续。

最新更新