В удивительной книге "Java Good Part" автор дает некоторый код, который возвращает копию объекта в его методе getter (используется с хорошо инкапсулированным полем), а затем заявляет:
Этот подход, который пытается вернуть копии личных данных а не ссылки на эти частные данные, как правило, хорошая идея
Почему это так? Я думал, что цель инкапсуляции состоит в том, чтобы убедиться, что никто не может фактически изменить частных членов. Так зачем писать что-то вроде этого
private someType fieldName = new someType();
...
определяя его получатель таким образом (предполагая, что существует какой-то экземпляр-конструктор)
someType getSomething()
{
return new someType(fieldName);
}
Из того, что я знаю сейчас, я имею в виду, прежде чем вы, ребята, поппите:
что имеет смысл до сих пор, что он обслуживает сбор мусора, поскольку этот подход не поддерживает ссылки на фактический объект.
он также может быть понятным с точки зрения внутреннего класса, из которого любой метод может изменить любое поле, доступное через ссылку.
Но я не подозреваю, что две причины для этого - это то, что действительно выходит за рамки этой проблемы.