#java #производительность
Как известно, объекты передаваемые в функциях являются ссылками, поэтому напрашивается
такой вопрос: примерно одинаково затратно будут первые два способа либо второй практически
равноценен созданию новых объектов, что, как я понимаю, безумно затратно (третий способ)?
Первый:
class A {
ArrayList < Point > list;
public A() {
list = new ArrayList < Point > ();
//представим, что тут лист заполняется сотней новых объектов
update();
}
void update() {
for (int i = 0; i < 100; i++) {
list.get(i).set(i, i); //
}
}
}
Второй:
class B {
ArrayList < Point > list;
public B() {
list = new ArrayList < Point > ();
//представим, что тут лист заполняется сотней новых объектов
update(list);
}
void update(ArrayList < Point > p) {
for (int i = 0; i < 100; i++) {
p.get(i).set(i, i); //
}
}
}
Третий:
class С {
ArrayList list;
public С() {
list = new ArrayList ();
//представим, что тут лист заполняется сотней новых объектов
list = update();
}
ArrayList update() {
ArrayList pp = new ArrayList ();
pp.addAll(list);
for (int i = 0; i < 100; i++) {
pp.get(i).set(i, i); //
}
return pp;
}
}
Смело использовать второй способ или все же продолжить проводить операции только
с полями классов, если возможно?
Ответы
Ответ 1
Первые два способа по стоимости практически одинаковы. Передача ссылочного типа есть не что иное, как передача ссылки (то есть, указателя, если вы знакомы с С или C++). Размер ссылки равен размеру одного регистра процессора на популярных платформах (то есть, практически бесплатно). Второй способ, однако, лучше тем, что у него меньшая связность: ваш метод update может использоваться не только с полем A.list, а и с любым другим объектом подходящего типа. Третий способ, разумеется, дороже (особенно для больших списков): у вас дополнительные расходы на копирование списка (не ссылки на список, а данных списка!).Ответ 2
Второй я бы сразу не рассматривал. От параметров стараются избавиться или уменьшить их количество. Если update() обновляет данные листа в своем классе, то не нужно его передавать параметром. Если вы все же заходите вызвать update(List...) из другого класса, то либо вы неправильно спроектировали класс и требуется рефакторинг, либо метод самое время сделать статическим и вообще перенести в другой класс, т.к. ему тут не место!
Комментариев нет:
Отправить комментарий