Вы никогда передаете объект в качестве аргумента в Java. Вы либо передаете ссылку или примитивное значение. Аргумент всегда передается по значению. У Java вообще нет передачи по ссылке.
Если вы передаете ссылку на объект и хотите убедиться, что код, который вы вызываете, не изменяет данные в этом объекте, ваши варианты:
- Создайте копию и передайте ссылку на нее
- Сделайте ваш тип неизменным в первую очередь.
РЕДАКТИРОВАТЬ: Просто чтобы прояснить, если у вас есть:
Foo f = new Foo();
тогда значение f
равно , а не a Foo
объекта. Это ссылка на Foo
объект. Если вы сейчас звоните:
doSomething(f);
, тогда значение f
копируется как исходное значение параметра в doSomething
. Такое поведение является в основном определением передачи по значению. doSomething
ничего не может сделать, чтобы изменить значение f
- оно все равно будет ссылаться на тот же объект впоследствии. Данные в пределах этого объекта могут измениться, но это не будет другой объект.
В реальной аналогии: если я дам вам копию моего адреса, вы можете пойти и покрасить входную дверь, но вы не сможете изменить место, где я живу.