2015-01-16 1 views
16

Я делаю проверку кода Java. Вот функция (фрагмент):Есть ли какая-либо польза для возврата результата назначения значения локальной переменной, а не значения напрямую?

String getValue() { 
    String res; 
    StringBuilder strBuilder = new StringBuilder(); 

    // More code here that sets strBuilder 

    return res = strBuilder.toString(); 
} 

Сначала появляется предупреждение о том, что значение res не используется. Во-вторых, я не понимаю возвращения. Почему бы вам не просто return(strBuilder.toString()). Есть ли какие-то преимущества?

+0

Поскольку 'res' не используется, вы правы, нет никаких оснований для возвращения в этом роде. Просто 'return bs.toString()' в порядке. – BackSlash

+0

Строка getValue() должна быть указана как часть кода, но я не могу заставить формат работать. Сожалею. – user3257891

+3

№ Переменная 'res' может быть безопасно удалена. –

ответ

12

res не используется, поэтому нет причин возвращаться так. Вы можете удалить его:

String getValue() { 
    StringBuilder bs = new StringBuilder(); 
    // 
    // More code here that sets sb 

    return bs.toString(); 
} 
+0

Любые теории о том, почему это было бы написано именно так? –

+4

Я предполагаю, что кто-то заменил множество строковых добавлений на «res» с построителем строк для оптимизации, но не совсем завершил работу. – Alan

+2

@MartinSmith Честно говоря, я не знаю ... Теория Алана хорошая, но кто знает, о чем думал разработчик, когда он писал этот код? :) – BackSlash

2

Вы абсолютно правы; присвоение res не имеет смысла; return bs.toString(); будет делать то же самое.


P.S. +1 для игнорирования предупреждений компилятора.

10

Такого рода кода иногда может возникнуть в результате неполного удаления отладочных артефактов:

String getValue() { 

    String res; 
    StringBuilder bs = new StringBuilder(); 
    // 
    // More code here that sets sb 

    res = bs.toString(); 
    // Test and/or display res here 
    return res; 
} 

Это, конечно, кажется хорошим кандидатом для следующего раунда рефакторинга и очистки.

-4

также может быть записана в виде:

String getValue() { 
    return new StringBuilder().toString(); 
} 
+2

Я думаю, что '// Больше кода здесь, который устанавливает sb'. Что-то вроде« Я не пишу здесь весь код, но обратите внимание, что в этом методе используется «bs» и имеет значение в конце его ' – BackSlash

+3

Вы можете просто« вернуть »«; », но это явно не так. –

6

Просто угадать, но некоторые (большинство?) Иды не позволяют непосредственно проверить значение возвратов функции. С помощью этой схемы вы можете поместить точку останова в конце метода и наведите указатель мыши на «res», чтобы получить возвращаемое значение.

+0

Возможность проверки значений - это почему я часто использую 'var res = расчет; return res; 'style. Я надеюсь, что оптимизатор (любого языка) будет генерировать тот же код для 'var res = calculate; return res; 'vs.' return calculate; '. –

+0

После написания комментария я понял, что, по крайней мере, для (pre move semantics) C++, имея стоимость присваивания и возврата, никакие циклы не требуют некоторой осторожности для писателя конструкторов экземпляра класса и операторов присваивания. Это может также произойти в Java для других классов, кроме строки. –

0

Вы не можете сделать что-либо

String res = strBuilder.toString(); 
return res ; 

Или напрямую,

return strBuilder.toString(); 

Теперь Если вы хотите знать о преимуществах, которые вы задали Is there any benefit, я всегда предпочитаю непосредственно возвращаться. Моя личная логика проста:

  • Вы собираетесь написать одну строку меньше кода !!! (объявление переменных allover для меня не очень хорошее, а также вам не нужно думать о имени переменной, конфликтах и ​​т. д. эти глупые вопросы)
  • Значение не будет сохранено в памяти и дождитесь GC, чтобы собрать его. SO, меньше памяти см. .....
  • Быстрая запись в переменную, а затем чтение из нее и возврат ..... больше читать/писать не так ли?

Эти вещи являются не большой, я должен был сказать, как вы просили