Проходя тему геттеров и сеттеров оставался один вопрос: Необходимо ли каждый раз возвращать клонированный объект из геттра? Я знаю что примитивные типы данных автоматически клонируются, но что делать с объектами, особенно если там большая вложенность?
Например, есть какой-то объект, мы его возвращаем без клонирования (то есть возвращаем ссылку), далее в коде изменяем его и выводим на экран, при этом изменяется и сам объект в классе, что недопустимо.
Какие варианты вижу я:
- С помощью SerializationUtils.clone() делать глубокое клонирование и возвращать объект, далее, если его нужно будет изменить в самом классе, делаю это с помощью сеттера. Вижу только одну проблему, если будет что-то тяжёлое, то глубокое клонирование сильно замедлит программу.
- Отдать ссылку и если это необходимо клонировать объект уже в коде.
Когда отдавать ссылку, а когда глубокую копию объекта?
public class Game {
Player player = new Player();
Field gameField = player.getField();
// Изменили объект в самом классе, так как отдали ссылку
Field newField = SomeClass.change(gameField);
System.out.println(newField);
}
public class Player {
private Field field;
public Field getField() {
return this.field;
}
}