Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Java - вопрос про ресурсоемкость параметров-объектов в методах

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

Комментариев нет:

Отправить комментарий