Всем привет!
Вчера писал, что на технических интервью многие соискатели испытывают проблемы с mutable/immutable сущностями.
Один из вопросов который мы задаем такой:
🤔 Как сделать объект immutable?
Большинство ребят отвечают примерно так:
1. Сделать класс final
2. Все поля - final, задавать их через конструктор
3. Убрать сеттеры
С этим я согласен, но мало кто вспоминает про еще один пункт:
4. Для ссылочных типов в геттерах необходимо возвращать копии объектов.
Если спросить зачем нам нужны immutable классы, часто можно услышать, что такие классы более безопасны.
Но чувствуется, что большинству недостает понимания потенциальной опасности использования mutable структур.
Рассмотрим такой пример. Как вы думаете, что не так с этим классом? 🤔
@AllArgsConstructor
@Getter
class Demo {
private List<String> names;
}
Проблемы могут быть не так очевидны, в связке с ломбоком, однако они есть.
Попробуйте определить их самостоятельно, прежде чем читать сокрытый текст.
1. В конструкторе передается ссылка на объект списка и присваевается полю names.
А это значит, что если список, который передали в конструктор класса будет модифицирован, он изменится и в объекте demo.
2. В геттере возвращается ссылка на объект списка names.
А это значит, что данный список, могут модифицировать извне.
Это можно увидеть в коде ниже:
public static void main(String[] args) {
final var names = new ArrayList<>(List.of("e1", "e2"));
final var demo = new Demo(names);
names.add("e3");
// [e1, e2, e3]
System.out.println(demo.getNames());
final var newNames = demo.getNames();
newNames.add("e4");
// [e1, e2, e3, e4]
System.out.println(demo.getNames());
}Такое может привести к ошибкам в программе ⚠️
И это один из примеров того, почему immutable классы более безопасны.
Есть еще одна вещь, но она в большей степени на слуху.
У immutable объектов не изменится hashCode 3️⃣6️⃣0️⃣8️⃣8️⃣7️⃣1️⃣
Что делает их более предпочтительными для использования в Hash-коллекциях
Но в основном, у большинства возникают сложности с обнаружением проблем в рабочем коде.
Будьте внимательны при работе с mutable классами, они таят в себе скрытую угрозу 🔫