2016-01-10 5 views
1

я после курса на 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? В чем преимущество использования геттеров и сеттеров в том же классе, в котором они написаны? Последнее я уже ответил, по крайней мере частично: он дает вам больше контроля над входом. Но зачем использовать геттеры?

+0

Видимость полей может быть 'private',' protected', 'default' (или видимый пакет) и' public'. Если вы сделаете свои поля частными, потому что вы хотите использовать сеттеры, вам нужны геттеры, потому что они по-прежнему закрыты. Это одна из причин, но в целом вы хотите отделить интерфейс от реализации, вы не хотите, чтобы на самом деле показывали, что у вас есть поле под названием 'international', а клиенты вашего класса не должны беспокоиться о реализации. Итак, мой вывод состоит в том, что геттеры служат абстракцией. – nbro

+0

@nbro Я понимаю это, но я не понимаю в этом конкретном случае, почему вы используете getter * в том же классе *, что и поле. Поле является закрытым, поэтому оно все еще видно в этом классе. Так зачем вам геттер? –

+0

Геттер, конечно, полезен для внешних классов, а не для методов одного класса (в общем). Разумеется, геттер также может быть полезен в других методах того же класса, если этот геттер выполняет какую-то специальную работу, что не так. – nbro

ответ

0

Я думаю, что есть два случая.

Во-первых, вы можете переопределить эти геттеры в будущих последователях класса, поэтому эти геттеры могут иметь другую реализацию.

В другом случае некоторые специальные логические внутренние геттеры, например null, могут иметь начальные значения. Этот метод часто используется для добытчиков полого сбора в автоматически генерируемые JAXB -annotated фасоли:

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

Я понимаю, что некоторые формы ленивого экземпляра, я думаю. Но это не объясняет, почему геттер используется в коде, который я дал. Там нет такой вещи. –

0

Это конечно не полезно для доступа к ней в классе, как вы бы непосредственно использовать international частное поле.

Но подумайте об этом потребителя parcel. Предположим, что почтовому отделению необходимо решить, следует ли его отправлять в международный адрес или на внутреннее место. Для того, чтобы почтовое отделение делало различие, оно не может напрямую обращаться к частному полю участка и, следовательно, будет делать вызов isInternational, и, следовательно, у вас есть метод getter в вашем классе Parcel.

+0

Я не понимаю, это не мой вопрос.Почему профессор, дающий этот курс, прокомментировал, что мы должны использовать getter внутри gethippingprice, хотя этот метод находится в том же классе, что и частное поле? –

+0

Вот как почтовое отделение будет оценивать своего клиента на основе того, является ли посылка внутренним или нет. – SMA

+0

Вы не понимаете. Я понимаю, почему нужны геттеры и сеттеры. Но не почему в этом конкретном случае вы будете использовать isInternational внутри метода, который находится в том же классе, что и частное поле. В любом случае поле доступно по методу, вам не нужен геттер. –

Смежные вопросы