Как известно, объекты передаваемые в функциях являются ссылками, поэтому напрашивается такой вопрос: примерно одинаково затратно будут первые два способа либо второй практически равноценен созданию новых объектов, что, как я понимаю, безумно затратно (третий способ)?
Первый:
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
public С() {
list = new ArrayList
ArrayList
Смело использовать второй способ или все же продолжить проводить операции только с полями классов, если возможно?
Ответ
Первые два способа по стоимости практически одинаковы. Передача ссылочного типа есть не что иное, как передача ссылки (то есть, указателя, если вы знакомы с С или C++). Размер ссылки равен размеру одного регистра процессора на популярных платформах (то есть, практически бесплатно). Второй способ, однако, лучше тем, что у него меньшая связность: ваш метод update может использоваться не только с полем A.list, а и с любым другим объектом подходящего типа.
Третий способ, разумеется, дороже (особенно для больших списков): у вас дополнительные расходы на копирование списка (не ссылки на список, а данных списка!).
Комментариев нет:
Отправить комментарий