在同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.
我正在学习关于 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.