在同一类的方法中使用封装getter

时间:2016-01-10 16:46:06

标签: java encapsulation setter getter

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

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?在他们编写的同一个类中使用getter和setter有什么好处?后者我已经至少部分地回答了:它让你可以更好地控制输入。但为什么要使用吸气剂?

2 个答案:

答案 0 :(得分:0)

我认为有两种情况。

首先,您可以在将来的类后继中覆盖这些getter,因此这些getter可以有另一个实现。

另一种情况是,getter中的一些特殊逻辑,例如null字段可以获得初始值。此方法通常用于自动生成的JAXB - 带注释的bean中的集合字段的getter:

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

答案 1 :(得分:0)

如果你直接使用international私有字段,那么它在课堂上访问它并没有用。

但请想一想这个parcel对象的消费者。假设邮局需要决定是否需要将其运往国际地点或国内地点。为了让邮局区分,它不能直接访问parcel的私有字段,因此会进行isInternational调用,因此你的Parcel类中有getter方法