Java:使用final setter避免警告“在构造函数中调用Overridable方法”

时间:2014-12-20 10:48:00

标签: java properties

在将值分配给字段之前,我总是使用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中,以防止覆盖这些属性吗?

1 个答案:

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