我正在学习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有什么好处?后者我已经至少部分地回答了:它让你可以更好地控制输入。但为什么要使用吸气剂?
答案 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方法