Почему я могу получить доступ к закрытой переменной из внешнего класса? - PullRequest
0 голосов
/ 20 апреля 2020

Мне было дано задание выяснить, как просматривать, но не редактировать приватный int из другого класса. Я пробовал некоторые слишком сложные вещи, но сработало следующее:

public int getC() { 
return myC; 
 }

my C - это приватный int. Неужели так просто дать другому классу доступ к закрытой переменной? Я думал, что они не могут быть разделены. Может ли кто-нибудь объяснить, почему это разрешено? Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Единственный способ раскрыть личные поля - через accessors aka getters.

Но вы должны следовать 2 правилам:

  • Избегать соблазна разоблачить непосредственно все ваши частные поля через геттеры (ide ярлыки). Добавляйте их только в случае необходимости.

  • Если раскрываемый вами тип не является неизменным, позаботьтесь не о escape references, вернув защитные копии

Пример:

private Date date;
public Date date() {
   return date;
}

Этот код нарушает инкапсуляцию, и это то же самое, что и это.

public Date date;

Чтобы решить эту проблему, у вас есть 2 решения

  • Вернуть защитную копию вашей даты
public Date date() {
   return new Date(date.getTime());
}
  • Использовать неизменную версию Date -> LocalDate

То же лог c применяется для типов коллекций.

0 голосов
/ 20 апреля 2020

Вы создали функцию получения publi c для доступа к закрытой переменной. Поэтому, если другой класс имеет экземпляр вашего класса в качестве локальной переменной, он может использовать функцию publi c (getter) для доступа к private переменной вашего исходного класса.

...