передача объектов по значению в Java - PullRequest
1 голос
/ 22 февраля 2011

так что предположим, у меня есть

ArrayList<E> X = new ArrayList<E>();

и я передаю X в некоторый параметр:

Something Y = new Something(X);

он передаст X по ссылке, а не по значению, и я не хочу этого .... class Что-то имеет поле с типом Arraylist, которое должно быть само по себе, и я не хочу идти и повторять через чертового массива и настраивать его индивидуально только для создания экземпляра поля ...

есть ли способ легко заставить Java передавать любые параметры объекта по значению, а не по ссылке, без необходимости реализовывать клонируемый интерфейс для всех моих объектов, что является проблемой в заднице

Ответы [ 3 ]

4 голосов
/ 22 февраля 2011

Поскольку Java не допускает непосредственное манипулирование указателем, вы не можете разыменовать указатель. Вы должны жить со ссылками. Если вы хотите предотвратить изменение переданного объекта, вы должны клонировать его или сделать его неизменным (например, String). Также имейте в виду, что ссылки на объекты передаются по значению . Таким образом, утверждения типа «У Java есть передача по ссылке» не точны, если мы возьмем передачу по ссылке в смысле C ++.

1 голос
/ 06 февраля 2013

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

List unmodifiableList = Collections.unmodifiableList(list);
List newList = new ArrayList(unmodifiableList);
Collections.sort(newList);

Конструктор ArrayList берет существующий список, читает его элементы (без их изменения!) И добавляет их в новый список.

1 голос
/ 22 февраля 2011

Фактически он передает X по значению. (Конструктор Something не может изменить переменную X в вызывающем коде.) X оказывается ссылкой на ArrayList, а не на ArrayList. Вы можете попробовать:

Something Y = new Something(new ArrayList<E>(X));
...