Которая из этих 2 форм соглашения на метод повторного способа лучше?

Всегда у меня было сомнение, если лучше создавать один object и тогда использовать метод этого объекта или не создавать объект, примеры:

  • Не создав раньше объекта класса, который он возвратил бы otroMetodo():

Sistema.algunMetodo().otroMetodo().print(algo, "Hola");
Sistema.algunMetodo().otroMetodo().print(algo, "¿Cómo");
Sistema.algunMetodo().otroMetodo().print(algo, "Estás?");
  • С объектом:

ClassDeOtroMetodo claseDeOtroMetodo = Sistema.algunMetodo().otroMetodo();
claseDeOtroMetodo.print(algo, "Hola");
claseDeOtroMetodo.print(algo, "¿Cómo");
claseDeOtroMetodo.print(algo, "Estás?");

Большое различие есть или то же самое?

1
задан 24.01.2017, 09:42
0 ответов

Главным образом завись от, если вывод методов они будут являться тем же самым или не в последующих вызовах. Если они могут меняться, тогда необходимо делать первую. Также завись, откуда ты определил ClassDeOtroMetodo claseDeOtroMetodo; в случае очень поднятого использования раз (он лучше вне цикла, что внутри, или как переменная, лишенная класса, чем как помещение метода, и т.д.).

Входя в детали:

Sistema.algunMetodo().otroMetodo().print(algo, "Hola");
Sistema.algunMetodo().otroMetodo().print(algo, "¿Cómo");
Sistema.algunMetodo().otroMetodo().print(algo, "Estás?");

Мы выполняем в большие черты (самое дорогое):

  • T1: Звонить в метод Sistema названный algunMetodo(). Возврати инстанцию объекта.
  • T2: Звонить в метод otroMetodo() инстанции, возвращенной предыдущим вызовом. Возврати инстанцию объекта.
  • T3: Звонить в метод print() инстанции, возвращенной предыдущим вызовом.

Это оказывается повторенным три раза 3·(T1 + T2 + T3) = 3·T1 + 3·T2 + 3·T3. Стоимость, возвращенная методом не может быть оптимизированной, должна быть призванной снова и снова.

Храня результат первых двух вызовов:

ClassDeOtroMetodo claseDeOtroMetodo = Sistema.algunMetodo().otroMetodo();
claseDeOtroMetodo.print(algo, "Hola");
claseDeOtroMetodo.print(algo, "¿Cómo");
claseDeOtroMetodo.print(algo, "Estás?");

Мы делаем в первой линии T1 + T2 и потом повторять три раза T3: T1 + T2 + 3·T3.

Времена от доступа к переменным и инстанциям и ассигнования презренные относительно времени от призыва к методам.


Эмпирические средства

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

class Sistema {
  ClassDeOtroMetodo salida = null;

  public Sistema() {
    salida = new ClassDeOtroMetodo();
  }
  ClassDeOtroMetodo algunMetodo() {
    return salida;
  }
}

class ClassDeOtroMetodo {
  long num = 0;
  void print(long n) {
    num += n;
  }
}

class prueba {
  public static void main(String args[]) {
    long t1, t2, t3, t4, i = 0, max = 10000000;
    Sistema pruebas = new Sistema();
    t1 = System.nanoTime();
    for (i = 0; i < max; i++) {
      pruebas.algunMetodo().print(1);
      pruebas.algunMetodo().print(2);
      pruebas.algunMetodo().print(i);
    }
    t2 = System.nanoTime();
    ClassDeOtroMetodo temporal1 = pruebas.algunMetodo();
    for (i = 0; i < max; i++) {
      temporal1.print(1);
      temporal1.print(2);
      temporal1.print(i);
    }
    t3 = System.nanoTime();
    for (i = 0; i < max; i++) {
      ClassDeOtroMetodo temporal2 = pruebas.algunMetodo();
      temporal2.print(1);
      temporal2.print(2);
      temporal2.print(i);
    }
    t4 = System.nanoTime();
    System.out.println("T1: " + (t2 - t1));
    System.out.println("T2: " + (t3 - t2));
    System.out.println("T3: " + (t4 - t3));
  }
}

Результат двух типов выполнения последующих:

redstar@nvidiastar:~$ java prueba ; java prueba
T1: 24835361
T2: 10742087
T3: 11362793
T1: 25489086
T2: 11132643
T3: 12097208

Поскольку он может наблюдаться, есть значительная выгода между использованием временной переменной, даже имея ее внутри цикла (хотя сокращается слегка результат).

2
ответ дан 03.12.2019, 17:34

Никакая форма не лучше или хуже, это зависит полностью от случая использования и контекста. Кроме того в обеих формах ты создаешь объект, различие, - если ты сохраняешь ссылку в переменной или нет.

Это значит, что не только у тебя есть различие в форме, также у тебя есть двусмысленность в теме, если оба кода делают то же самое. Почему?

 public static ClassDeOtroMetodo otroMetodo();

Это интерфейс, который возвращает объект, с которым ты работаешь. То, что не известно, если этот метод возвращает тебе один Singleton, знача, что он всегда гарантировал бы тебе тот же объект с каждым выполнением, или если метод приказывает тебе на новом объекте с каждым вызовом.

В первом случае, твои коды сделали бы то же самое, во втором случае не.

Он остался ясным?

0
ответ дан 03.12.2019, 17:34