Геттеры, сеттеры и инкапсуляция

348
22 августа 2017, 12:01

Окей. С самого первого знакомства с инкапсуляцией и её свойствами сокрытия данных, для меня остается непонятным один момент: поля класса, помеченные модификатором private, недоступны другим классам - это ясно.
Допустим:

public class Solution {
    public static void main(String[] args) {
    }
    public class Cat {
        private String name;
        public Cat(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) { // этот метод противоречит принципам инкапсуляции
            this.name = name;
        }
    }
}

Когда мы вызываем метод setName("Васька"), ведь он меняет значение поля? Если да, то это мне не очень понятно. Я имею в виду: какая разница, отметили ли мы поле модификатором доступа private? Если мы получаем доступ к нему через сеттер и меняем его значение как хотим?

Answer 1

Пожалуй, заново расписывать велосипед не стану, ибо вопросов, аналогичных вашему, в интернете предостаточно - вот, например: Геттеры-сеттеры в Java, или ещё вот: Java. Зачем геттеры и сеттеры для полей public? (кроме проверок), а также хорошие ответы здесь: А существует ли инкапсуляция, если есть рефлексия?.

Если сказать кратко: для соблюдения парадигмы ООП, инкапсуляции; для удобства и красоты кода; для сокрытия реализации от пользователя; для того, чтобы в наследуемых классах, или реализующих ваш интерфейс, можно было переопределить получение значения нужного поля, ну и так далее.

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

READ ALSO
Как разделить строку по знаку через .split?

Как разделить строку по знаку через .split?

Пытаюсь разделить строку по пайпу, почитал, как это все делается, но не могу понять, что не такНе работает

228
javafx получения элемента из другого fxml и с методами другого котроллера

javafx получения элемента из другого fxml и с методами другого котроллера

ЗдравствуйтеПриложение имеет TabPane, имеем кнопку которая в TabPabe добавляет ещё один Tab, но этот Tab вместе с контентом не создаётся в контроллере...

235
Подключение файла в JAR через Netbeans

Подключение файла в JAR через Netbeans

Пользуюсь средой разработки NetBeansСобираю с помощью Ant

417
Как я могу получить int из string?

Как я могу получить int из string?

Есть такой кусочек кодаПо bluetooth я получаю строку с двумя переменными, разделяю их по пайпу, потом каждую переменную по отдельности показываю...

212