Окей. С самого первого знакомства с инкапсуляцией и её свойствами сокрытия данных, для меня остается непонятным один момент: поля класса, помеченные модификатором 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? Если мы получаем доступ к нему через сеттер и меняем его значение как хотим?
Пожалуй, заново расписывать велосипед не стану, ибо вопросов, аналогичных вашему, в интернете предостаточно - вот, например: Геттеры-сеттеры в Java, или ещё вот: Java. Зачем геттеры и сеттеры для полей public? (кроме проверок), а также хорошие ответы здесь: А существует ли инкапсуляция, если есть рефлексия?.
Если сказать кратко: для соблюдения парадигмы ООП, инкапсуляции; для удобства и красоты кода; для сокрытия реализации от пользователя; для того, чтобы в наследуемых классах, или реализующих ваш интерфейс, можно было переопределить получение значения нужного поля, ну и так далее.
И, да: по сути, вы не получаете доступа к полю, вы получаете доступ к методу, который возвращает значение того или иного параметра. Также, метод не всегда может возвращать/устанавливать именно само значение поля. Как верно подмечено в ответах на один из перечисленных выше вопросов, благодаря инкапсуляции, те пользователи, которые будут использовать ваш класс, будут знать, какие поля можно читать, какие перезаписывать, а какие трогать вообще не стоит. Да и вам самим будет удобнее, тем более если будет необходимость вернуться к этому коду через длительное время.
Продвижение своими сайтами как стратегия роста и независимости