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