Как сделать сильную инкапсуляцию при работе с наследованием? - PullRequest
3 голосов
/ 18 апреля 2019

Я действительно новичок в этом, поэтому извините, если это слишком глупо.У меня возникают проблемы с решением, какую видимость использовать при использовании наследования в Java.

Для того, что я прочитал, чтобы иметь сильную инкапсуляцию, вы обычно устанавливаете свои атрибуты как закрытые и обращаетесь к ним с помощью открытых методов.

Но это не пойдет, когда у тебя есть неотъемлемость?Когда я читал документацию по Oracle, там говорится, что только открытые / защищенные члены наследуют подкласс.Но если я сделаю это, нарушу ли я инкапсуляцию?

Между тем, я использовал частные атрибуты в своем суперклассе, и я получал доступ к этим полям в своем дочернем классе с помощью открытых методов.Например:

abstract public class Person{

  private String name;

  Person(String name){
    this.name = name;
  }

  public String getName(){
    return this.name;
  }

  public void setName(String name){
    this.name = name;
  }
}

public class Employee extends Person {

  private int salary;

  Employee(String name, int salary){
    super(name);
    this.salary = salary;
  }

  public void getDescription(){
    return "Name is " + getName() + " and salary is " + this.salary;
  }

}


Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Я нарушаю инкапсуляцию?

Вы ничего не нарушаете. Защищенные члены по-прежнему невидимы для остального мира (за исключением классов в пакете и подклассов).

Modifier    Class   Package Subclass    World
private       N        N       N          N
protected     Y        Y       Y          N

Защищенное поле абсолютно нормально, если вам нужно иметь прямой контроль над ним и обходить геттеры / сеттеры, которые могут исказить этот доступ.

С другой стороны, личное поле имеет смысл, когда вы не много играете с полем: private String name; и "Name is " + getName() абсолютно правильны, потому что вам все равно, что именно будет возвращено - все, что представляет имя будет достаточно.

Как правило, "используйте самый ограниченный уровень доступа, который имеет смысл для конкретного участника. Используйте private, если у вас нет веских причин не делать этого".

0 голосов
/ 18 апреля 2019

Для того, что я прочитал, чтобы иметь сильную инкапсуляцию, вы обычно устанавливаете свои атрибуты как закрытые и обращаетесь к ним с помощью открытых методов.

Для надежной / правильной инкапсуляции вы устанавливаете свои атрибуты как приватные. Полная остановка. Вы не должны получать доступ к этим атрибутам через какие-либо методы, вы должны предлагать методы, которые используют эти атрибуты для реализации некоторой части бизнес-логики.

[...] говорит, что только публичные / защищенные члены будут наследовать подклассу [...]

Все будет наследоваться, оно будет только невидимым для подкласса. Так что это будет часть объекта, вы просто не сможете получить к нему прямой доступ.

[используя открытые / защищенные атрибуты] Но если я сделаю это, нарушу ли я инкапсуляцию?

Да. Вы почти всегда нарушаете инкапсуляцию, когда делаете внутреннее состояние доступным, либо напрямую (делая его чем-то отличным от приватного), либо используя метод «получения» или аналогичный метод.

0 голосов
/ 18 апреля 2019

Возможно, посмотрите на javadoc о видимости, но в вашем случае защищенное - это правильное ключевое слово, вы также можете просто пропустить видимость, тогда оно по умолчанию будет пакет

...