在将值分配给字段之前,我总是使用setter作为验证值的地方。
public class Person {
private int id;
public int getId() {
return this.id;
}
public int setId(int id) {
if (id < 0) {
throw new IllegalArgumentException("id must be positive.");
}
this.id = id;
}
public Person(int id) {
setId(id);
}
}
我认为好的是我现在有一个地方可以在分配之前验证一个值,我可以从任何地方调用它。但编译器警告我在类的构造函数中调用overridable方法。我阅读了What's wrong with overridable method calls in constructors?并了解了可能导致的问题,建议您使用Builder Pattern。但是也可以将final添加到getter和setter中,以防止覆盖这些属性吗?
答案 0 :(得分:0)
是否也可以将final添加到getter和setter中,以防止覆盖这些方法?
是的,它会的。除了停止警告之外,它还会使您的代码更加健壮,因为子类无法有意或无意地更改您的setter中的验证。
另一个解决方案是创建一个私有方法来验证数据,并从构造函数和setter中调用它。这也可以解决问题:
private void setIdChecked(int id) {
if (id < 0) {
throw new IllegalArgumentException("id must be a positive.");
}
this.id = id;
}
public void setId(int id) {
setIdChecked(id);
}
public Person(int id) {
setIdChecked(id);
}