2016-03-21 3 views
0

Я не понял требования сделать класс неизменным в Java. Ниже приводится требование, которое я не могу понять:Создание неизменяемого класса в Java с изменяемой ссылкой

1) Если поля экземпляра включают ссылки на изменяемые объекты, не допустить, чтобы эти объекты должны быть изменены:

а) Не предоставляют методы, которые изменить изменяемые объекты.

b) Не сообщайте ссылки на изменяемые объекты. Никогда не храните ссылки на внешние, изменяемые объекты, переданные конструктору; при необходимости, создавать копии и хранить ссылки на копии. Аналогичным образом создайте копии своих внутренних изменяемых объектов, когда это необходимо, чтобы избежать возврата оригиналов в ваши методы.

Пожалуйста, объясните это понятие с помощью простого и простого примера.

+2

просто посмотрите на 'String'. Вы не можете изменять его напрямую, любые изменения, внесенные в экземпляр «String», всегда возвращают новый экземпляр «String». Вы не можете изменить экземпляр 'String', просто вызвав его методы. – SomeJavaGuy

ответ

2

Не предоставляют методы, которые модифицируют изменяемые объекты

Если вы не предоставите добытчиками, и если этот экземпляр не был принят в класс от внешнего источника (обычно передается в конструктор) , то только ваш класс имеет доступ к этому составленному экземпляру.

Никогда не хранить ссылки на внешние, изменяемые объекты, переданные в конструктор

В Java даже ссылки передаются по значению, поэтому когда ссылочный тип передается в конструктор ваш класс, вам нужно сделать копию экземпляра (т. е. не использовать переданный экземпляр, используйте копию с копией).

создайте копии своих внутренних изменяемых объектов, если необходимо, чтобы избежать , возвращая оригиналы в ваших методах.

Если вы должны вернуть ссылочные типы с вызывающим абонентом, то вы должны вернуть защитные копии вместо ссылок на оригинальные экземпляры.