я после курса на 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()
. Зачем нужен геттер isInternational
, и почему бы не использовать international
? В чем преимущество использования геттеров и сеттеров в том же классе, в котором они написаны? Последнее я уже ответил, по крайней мере частично: он дает вам больше контроля над входом. Но зачем использовать геттеры?
Видимость полей может быть 'private',' protected', 'default' (или видимый пакет) и' public'. Если вы сделаете свои поля частными, потому что вы хотите использовать сеттеры, вам нужны геттеры, потому что они по-прежнему закрыты. Это одна из причин, но в целом вы хотите отделить интерфейс от реализации, вы не хотите, чтобы на самом деле показывали, что у вас есть поле под названием 'international', а клиенты вашего класса не должны беспокоиться о реализации. Итак, мой вывод состоит в том, что геттеры служат абстракцией. – nbro
@nbro Я понимаю это, но я не понимаю в этом конкретном случае, почему вы используете getter * в том же классе *, что и поле. Поле является закрытым, поэтому оно все еще видно в этом классе. Так зачем вам геттер? –
Геттер, конечно, полезен для внешних классов, а не для методов одного класса (в общем). Разумеется, геттер также может быть полезен в других методах того же класса, если этот геттер выполняет какую-то специальную работу, что не так. – nbro