в отношении утилизации объекта - PullRequest
1 голос
/ 15 июня 2010

У меня есть вопрос.Что не так с приведенным ниже кодом:

ArrayList tempList2 = new ArrayList();
tempList2 = getXYZ(tempList1, tempList2);

//method getXYZ
getXYZ(ArrayList tempList1, ArrayList tempList2) {

  //does some logic and adds objects into tempList2

  return tempList2;
}

Код будет выполнен, но, передавая tempList2 аргументу метода getXYZ, он выполняет рециркуляцию объекта.Правильно ли перерабатывать объект массива tempList2?

Ответы [ 3 ]

3 голосов
/ 15 июня 2010

Здесь действительно нет такого понятия, как «переработка объектов». Ничто не собирает мусор, если это то, что вас интересует ... по крайней мере, если нет таких строк:

tempList2 = new ArrayList();

в пределах getXYZ().

Ссылка на ArrayList передается в метод, а затем возвращается. Это все. Это просто ссылка - это не сам объект.

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

3 голосов
/ 15 июня 2010

У меня вопрос: правильно ли перерабатывать объект массива tempList2?

Я не совсем понимаю, что вы подразумеваете под "перезаписью".Похоже, это не тот случай, когда приложение перерабатывает объекты в попытке избежать выделения новых объектов.(Это обычное значение «рециркуляции» в Java.)

Если getXYZ вызывается несколько раз с одним и тем же tempList2 объектом, то это просто способ объединения материала в один список.Тот факт, что getXYZ возвращает ArrayList, оставляет возможность того, что реализация метода может быть изменена для возврата другого экземпляра ArrayList.Это не проблема per se , но может случиться так, что вызывающий абонент не назначит результат вызова соответствующим образом.

Если getXYZ вызывается только один раз для любого заданного tempList2 объект, то это выглядит немного странно.

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

EDIT - в ответ на этот комментарий (встроенный, чтобы сделать его читабельным)

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

ArrayList tempList2 = new ArrayList(); 
tempList2 = getXYZ(tempList1);

//method getXYZ 
getXYZ(ArrayList tempList1) { 
    ArrayList tempList = new ArrayList();
    //INSTANTIATED ONLY ONCE 
    //does some logic and adds objects into tempList 
    return tempList; 
}

real обычный способ сделать это будет:

ArrayList tempList2 = getXYZ(tempList1);

или

ArrayList tempList2;
// some intermediate lines
tempList2 = getXYZ(tempList1);

Ни один из них не требует создания ненужного ArrayList экземпляра вашего подхода, и ни один не требует передачи 2 ArrayList экземпляров в метод getXYZ.

0 голосов
/ 15 июня 2010

Вы передаете значение ссылки tempList2. Сам объект не копируется. Поэтому, когда переданный tempList2 изменяется, вызывающая сторона видит изменения. Это также называется call-by-share

Так что в этом нет ничего плохого, если вы понимаете, что происходит.

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