В приведенном выше примере есть хороший аргумент, что, поскольку A поддерживает ссылку на B, A должен присматривать за B, а не раздавать его, а манипулировать им от вашего имени. В противном случае вы можете утверждать, что нарушаете инкапсуляцию (поскольку A показывает, что она имеет ссылку на B), и в идеале объекты должны делать что-то для вас , а не экспортировать их содержимое, чтобы вы могли ими манипулировать. 1003 *
Сказав все это, вышесказанное, безусловно, не является необычной практикой и часто прагматичным выбором.
Когда вы выставляете объект с помощью get (), у вас есть три варианта:
- выставить фактический объект
- сделать защитную копию
- выставить объект, который оборачивает оригинал, но запрещает модификацию. например Вы можете обернуть оригинальный объект в ограниченном интерфейсе. См. (Например) Collections.unmodifiableCollection () , которая оборачивает исходную коллекцию (и не копирует ее), но предоставляет интерфейс, который не допускает изменения.
Что бы вы ни делали, вы должны документировать это в интерфейсе (и, следовательно, в Javadoc). В противном случае вы можете изменить его позже, и зависимый код может легко сломаться.