Добавить в корзинуПозвонить
Найти в Дзене
Java

Java-совет, который кажется мелочью, пока кто-то не сломает вам состояние объекта

Не возвращайте наружу изменяемые внутренние коллекции. Плохой вариант: ```java public List<String> getMembers() { return members; } Так вызывающий код получает прямой доступ к вашему внутреннему списку. После этого он может сделать: team.getMembers().clear(); И внезапно вся команда исчезла. Не через метод доменной модели, не через проверку прав, не через бизнес-логику, а просто потому что геттер отдал наружу ссылку на mutable state. Нормальный вариант: public List<String> getMembers() { return Collections.unmodifiableList(members); } Или, если нужен безопасный снимок: public List<String> getMembers() { return List.copyOf(members); } Разница важная: * unmodifiableList даёт read-only view поверх текущей коллекции * List.copyOf создаёт неизменяемую копию на момент вызова Это защищает инварианты объекта и оставляет вам свободу менять внутреннюю реализацию. Сегодня внутри может быть ArrayList, завтра Set, послезавтра вообще другая структура. Внешний код не должен зависеть от тог

Java-совет, который кажется мелочью, пока кто-то не сломает вам состояние объекта.

Не возвращайте наружу изменяемые внутренние коллекции.

Плохой вариант:

```java

public List<String> getMembers() {

return members;

}

Так вызывающий код получает прямой доступ к вашему внутреннему списку. После этого он может сделать:

team.getMembers().clear();

И внезапно вся команда исчезла. Не через метод доменной модели, не через проверку прав, не через бизнес-логику, а просто потому что геттер отдал наружу ссылку на mutable state.

Нормальный вариант:

public List<String> getMembers() {

return Collections.unmodifiableList(members);

}

Или, если нужен безопасный снимок:

public List<String> getMembers() {

return List.copyOf(members);

}

Разница важная:

* unmodifiableList даёт read-only view поверх текущей коллекции

* List.copyOf создаёт неизменяемую копию на момент вызова

Это защищает инварианты объекта и оставляет вам свободу менять внутреннюю реализацию. Сегодня внутри может быть ArrayList, завтра Set, послезавтра вообще другая структура. Внешний код не должен зависеть от того, как именно вы храните данные внутри.

Это граница инкапсуляции. Если отдали mutable-ссылку наружу, объект уже не полностью контролирует своё состояние.

#java #javadev