Это свойство считается невероятно важным в ООП языках, где она прописана как один из ключевых элементов. Делая наши поля приватными, мы таким образом даем доступ только через публичный интерфейс, который следит за соблюдением инвариантов. Так?
Только если в теории. На практике поменять почти все что угодно не составляет никакого труда. Предположим что у нас есть пользователь и у него должна быть установлена хотя бы одна роль и это проверяется где-то внутри пользователя (тут не показано) при изменении списка ролей.
```java
class User {
private final List<Role> roles = new ArrayList<>();
public List<Role> getRoles() {
return roles;
}
}
```
Но нам никто не машет сделать так:
```java
user.getRoles().clear(); // теперь ролей нет
// Можно добавить дубль
user.getRoles().add(new Role("admin"));
user.getRoles().add(new Role("admin"));
```
Даже если геттеров нет, рефлексия пробивает любую «защиту»:
```java
var field = User.class.getDeclaredField("roles");
field.setAccessible(true);
@SuppressWarnings("unchecked")
var roles = (List<Role>) field.get(user);
roles.clear();
```
Мое мнение о механизме private/protected/public со временем сильно поменялось, когда я пописал на языках где этого нет, но есть ООП. По большому счету этот механизм является в первую очередь защитой от дурака и он вообще не влияет на архитектуру. Если взять любой проект и поменять там все на public, то проект продолжит работать как ни в чем не бывало (если конечно код не завязан на рефлексию с этими).
Это не значит что инварианты соблюдать не надо и не нужно иметь публичный интерфейс для работы с нашими объектами (иначе как обновлять код и либы?). Речь скорее про другое, это не панацея и уж точно не механизм, который влияет хоть как-то на архитектуру. Обозначать публичный и внутренний интерфейс можно и другими способами, а данные внутри объектов часто делают закрытыми в принципе без возможности обращаться к ним без методов или рефлексии.
p.s. Какие еще способы вы знаете как обойти private?
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев