#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 С { ArrayListlist; 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...) из другого класса, то либо вы неправильно спроектировали класс и требуется рефакторинг, либо метод самое время сделать статическим и вообще перенести в другой класс, т.к. ему тут не место!
Комментариев нет:
Отправить комментарий