在同class的方法中使用封装getter

Using encapsulation getter in methods of the same class

我正在学习关于 Java 的课程,一个可能的考试问题的解决方案如下(在一个名为 Parcel 的 class 中):

private boolean international;
private double weight;

public Parcel(boolean international, double weight){
    // It is important to also use encapsulation in the constructor. Here we force all
    // variable access through the setter methods. In our example this makes sure that
    // all parcels have a negative weight. If later modifications are made to what values
    // are acceptable, we only need to change the accessor methods, instead of all pieces of code
    // that modify the variable.
    this.setInternational(international);
    this.setWeight(weight);
}

public double getShippingPrice(){
    // Also in this case it is recommended to use the accessor method instead of directly accessing the variable
    if(this.isInternational()){
        return (15 + 7*this.getWeight());
    } else {
        return (5 + 4*this.getWeight());
    }
}
public boolean isInternational(){
    return this.international;
}

public void setInternational(boolean international){
    this.international = international;
}

public double getWeight(){
    return this.weight;
}

public void setWeight(double weight){
    if(weight >= 0){
        this.weight = weight;
    }
    else{
        throw new IllegalArgumentException("A package cannot have a negative weight");
    }
}

我理解为什么封装对国际化有用:通过这样做,我们确保给定的值是我们想要的值,并在需要时抛出异常。但是,我不明白为什么您需要这种在 get getShippingPrice() 方法中工作的方式。为什么需要 getter isInternational,为什么不用 international?在相同的 class 中使用 getters 和 setter 有什么好处?后者我已经回答了,至少是部分回答:它让你对输入有更多的控制。但是为什么要用getters呢?

我认为有两种情况。

第一个是您可以在以后的 class 个后继者中覆盖这些 getter,因此这些 getter 可以有另一个实现。

另外一种情况,getters内​​部有一些特殊的逻辑,比如null字段可以获取初值。该方法常用于auto-generated JAXB注解bean中集合字段的getter:

public List<String> getList() {
    if (this.list == null) {
        this.list = new ArrayList<>();
    }
    return this.list;
}

在 class 中访问它当然没有用,因为您将直接使用 international 私有字段。

但是想想这个 parcel 对象的消费者。假设 post office 需要决定是将其运送到国际地点还是国内地点。为了让 post office 做出区分,它不能直接访问包裹的私有字段,因此会进行 isInternational 调用,因此你的 Parcel 中有 getter 方法] class.