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

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

7
задан Felix Kling 1 August 2010 в 19:43
поделиться

5 ответов

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

10
ответ дан 6 December 2019 в 10:47
поделиться

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

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

или

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

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

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

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

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

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

foo.donkey();
...
foo.kong();
4
ответ дан 6 December 2019 в 10:47
поделиться

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

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

1
ответ дан 6 December 2019 в 10:47
поделиться

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

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

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);

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

2
ответ дан 6 December 2019 в 10:47
поделиться

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

  • Для основных методов JavaBean/map/list get я обычно вызываю дважды для удобства, но это личный вкус. То же самое с методами is something
  • Для более дорогих операций, которые возвращают значение (например, URL), лучше всего сохранять, поскольку это долгая операция - выйти в интернет, получить данные и сообщить их обратно
  • Если метод изменяет ЛЮБОЕ значение при получении данных, я сохраняю значение
1
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: