Почему мы объявляем частные поля, когда у нас есть аксессоры и мутаторы?

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

Я не понимаю, что если я создаю общедоступный метод accesor и mutator, это не переменная public в этот момент? Почему все еще условно использовать частные переменные в ситуациях, когда кто-либо может получить к ним доступ?

Следует также отметить, что я понимаю важный из этих методов, но я хотел бы знать, почему мы пытаемся сделать переменную приватной, даже если мы предоставляем кому-либо доступ к ней с помощью этих методов?

Ответ 1

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

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

У него есть и другие преимущества. Вы можете сделать доступ synchronized, если хотите позже, без нарушения кода клиента, например. Короче говоря, он допускает множество модификаций позже, что в противном случае было бы невозможно, не вызывая много разломов в коде, который использует класс.

И вы можете добавить дополнительную логику, которая регистрируется всякий раз, когда кто-то пишет в поле, или предотвращает запись определенных потоков, или что-то еще... вы можете изменить тип поля с HashMap на TreeMap, если ваш getter абстрагирует его и просто возвращает Map... и т.д.

Ответ 2

Частные поля считаются внутренними для объекта. Поэтому внешнему миру не нужно знать, как данные хранятся внутри объекта. Это означает, что вы можете легко изменить внутреннее представление данных объекта, в то время как все остальные используют одни и те же устройства доступа/мутаторы для выполнения своей работы.

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

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