0

Об этом так много тем и все как то пытаються писать терминами или писать десертации.Если простыми словами в крации вся суть какая с примером?

1.Подскажите, нужна ли инкапсуляция , сокрытие полей модификаторами private , если сеттером можно изменить данные?

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

GoodDay
  • 11
  • 3
    1 - да. Если поле public, то зачем вообще добавлять геттеры/сеттеры? 2 - нет, обычно напрямую с полями идет работа, не с копией. Конечно внутри поле может быть реализовано как какой-нибудь хитрый проперти объект с историей изменений, но обычно - нет. – insolor Nov 16 '23 at 08:34
  • тогда почему все вокруг менторы трубят о том что это хороший тон, закрывать данные и работать с их оболочкой и там уже изменять – GoodDay Nov 16 '23 at 08:41
  • Чтобы можно было что-то поменять внутри, а снаружи все продолжало выглядеть как раньше (с точки зрения внешнего кода интерфейс не изменялся). – insolor Nov 16 '23 at 08:51

1 Answers1

0
  1. Сеттером можно изменить данные, а можно и не изменить. Это будет зависеть от самого сеттера, так как сеттер — это целая программа, которая как раз и предназначена для определения возможности изменения данных или не выполнения этих изменений, а также для выполнения сопутствующих действий. Например, рисование прямоугольника. Изменение размеров не только запишет новые значения в соответствующие поля, но и вызовет отрисовку этого прямоугольника с новыми размерами, что выполняется сеттером.
  2. Нет. Работаем с копией поля всегда, а вот что хранится в этом поле уже зависит от типа его значения, который может быть значащим или ссылочным. Если поле значащего типа, то мы получим через геттер копию данных, если поле ссылочного типа - то получим ссылку (копию ссылки) на данные, которые можно будет менять (если нет других ограничений), а вот саму ссылку в поле изменить нельзя. Например, поле является массивом. Через геттер получаем копию значения поля - ссылку на массив и можем менять элементы, но само поле всегда будет указывать на этот массив, и изменить это без прямого доступа к полю нельзя.
rotabor
  • 4,251
  • Смотрите во 2 пункте , вы пишите нет , мы не работаем с копией? и в тоже время пишите что мы работаем с копией но она может быть ссылкой или значением.Вы запутали меня. – GoodDay Nov 16 '23 at 12:12
  • Мы всегда получаем копию поля, но не всегда это непосредственно является данными. А вы спрашиваете именно про копию данных. – rotabor Nov 16 '23 at 12:14
  • понятно, спасибо – GoodDay Nov 16 '23 at 12:27