Лучше ли сохранить значение как переменную или снова вызвать метод?

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

5 ответов


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


как я понимаю вопрос, он спрашивает, Что лучше

Bar bar = foo.getBar();
bar.donkey();
...
bar.kong();

или

foo.getBar().donkey();
...
foo.getBar().kong();

если getBar дорого, вряд ли будут значительные различия в производительности. Точно так же и с памятью вряд ли возникнут проблемы. Сосредоточьтесь на понятности.

есть разные мнения.

Я считаю, что Мартин Фаулер предпочитает последнее. Код независим, и, вероятно, проще рефакторить.

Я мнение, что рефакторинг служит цели понятности. Первый говорит мне, что объект, используемый в обоих вызовах, действительно имеет общий источник, и в качестве бонуса, что это [тип]. Это обычно более явно и, хотя более многословно, происходит меньше.

С другой стороны, вы можете превратить его во что-то вроде:

foo.donkey();
...
foo.kong();

создание временной переменной вряд ли будет медленнее.

что еще более важно: сохранение возвращаемого значения в переменной повышает читаемость и ремонтопригодность кода. Например:

Biz nibb = getBiz();
frobnicate(nibb.foo(), nibb.bar());
galuncify(nibb.bar());

если я решу, что значение nibb.biz() вместо nibb.bar(), Я должен помнить, чтобы заменить его в два места. Эта проблема не возникла бы, если бы я использовал переменную вместо:

Biz nibb = getBiz();
Bar bar = nibb.bar();
frobnicate(nibb.foo(), bar);
galuncify(bar);

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


есть много факторов, в том числе и личного вкуса, дороговизны метода, модификации, что метод делает, и т. д.

  • для основных методов JavaBean / map / list get я обычно дважды вызываю для redability, но это личный вкус. То же самое с чем-то методами
  • для более дорогих операций, которые возвращают значение (т. е. url stuff), его лучше хранить, так как это длинная операция, чтобы выйти в интернет, получить данные и сообщить обратно
  • Если метод изменяет что-либо при извлечении данных, я сохраняю значение

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

то есть, измерьте время и профиль памяти вашей программы, используя реалистичные данные. Даже относительно тривиальные куски кода, трудно выработать соответствующие последствия для встраивания, преобразование в формат JIT, кэша и так далее.