Неэффективно ли инициализировать переменную несколько раз, а не переназначать ее?

#java #android

#java #Android

Вопрос:

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

В этой вспомогательной функции мне нужно передать переменную другой вспомогательной функции.

Мой вопрос в том, является ли плохой практикой инициализировать эту переменную в первой вспомогательной функции каждый раз?

В основном:

Пример 1: Инициализация b в funcA

 funcA(byte[] bytes) {
    ...
    byte b = bytes[0];
    funcB(b);
}

while(...) {
    byte[] bytes;
    funcA(bytes);
}
 

или

Пример 2. Инициализируйте b снаружи и просто переназначите

 byte b;

funcA(byte[] bytes) {
    ...
    b = bytes[0];
    funcB(b);
}

while(...) {
    byte[] bytes;
    funcA(bytes);
}
 

Что лучше? (Я вызываю funcA примерно 20-30 раз) Я полагаю, я мог бы просто сделать funcB(bytes[0]) , но я хочу присвоить ее переменной для удобства чтения.

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

1. Функция должна возвращать новое значение и оставлять старое значение в покое.

Ответ №1:

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

В общем, переменные должны быть определены в максимально узкой области видимости. Более эффективно определять переменные только там, где они используются, и не сохранять переменные, когда они не используются. «Создание новой переменной здесь» в основном бесплатное; оно просто становится частью памяти, выделенной в стеке для этой функции.

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

1. Ха, почему я об этом не подумал, это имеет смысл .. спасибо

Ответ №2:

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

В вашем случае этот массив должен быть определен и инициализирован там, где это необходимо. Я предполагаю, что вы передаете в нем некоторые значения, поэтому имеет смысл объявить его в while и передать дальше funcA . Если вы собираетесь передать пустой неинициализированный объект в свою функцию, есть большая вероятность, что вы делаете что-то очень неправильное, и на самом деле нет никакой необходимости передавать этот объект вообще.

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

1. О, конечно, сначала я присваиваю байты чему-то, я просто полностью урезал свой код для этого вопроса.

2. Тогда для byte вашего третьего варианта лучше всего просто передать его in place , нет необходимости создавать переменную, чтобы использовать ее один раз в качестве аргумента функции. На самом деле это противоположно удобочитаемости. Анонимные переменные — это круто, и, что более важно, они четко указывают, где они используются. Объявление любой переменной в global области видимости, как правило, плохо, поскольку вы не можете знать, где они используются, не отслеживая их вручную.