Существует в основном 3 способа написания кода:
Ваша версия:
String x = new String();
Рекомендуемая версия 1 FindBugs
String x = "";
Самая эффективная версия 2 :
String x; // No initialization is needed when the first thing we will do
// with 'x' is to assign a (real) value to it
Вы также можете переместить объявление, чтобы вы могли написать последнюю версию как:
String x = scanner.nextLine();
Другие версии, скорее всего, являются производными от первой версии, которые еще менее эффективны. (Они могут остановить FindBugs
от жалоб, но это плохая идея.)
Есть ли другой способ оптимизации кода без избавления от 'new String ()'
Нет. Смотри выше.
Смысл FindBugs
в том, что неэффективно использовать конструктор String()
, и почти во всех случаях это не нужно.
Это также, вероятно, неэффективно и (IMO) определенно плохо для читабельности без необходимости инициализировать локальную переменную. Однако стоимость new String()
намного превышает стоимость ненужной инициализации.
(Единственные случаи, когда может потребоваться использовать new String()
, это когда ваше приложение сознательно реализовано для использования String
идентификатора объекта (например, вы используете ==
для сравнения строк) и вам нужно иметь несколько отдельные String
экземпляры "строки нулевой длины". Мне трудно думать о реальных приложениях, где вы бы хотели это сделать.)
1 - FindBugs рекомендует альтернативу. Это не «говорит тебе» что-то делать. Помните, что рекомендации такого инструмента, как FindBugs, обычно основаны на простой эвристике и не всегда являются лучшим решением.
2 - Я должен квалифицировать это. Возможно ... даже вероятно ... что JIT-компилятор заметит, что эта инициализация не нужна, и не выдаст никаких инструкций собственного кода для этого. Это сделало бы аргумент спорным. На самом деле, даже возможно, что JIT-компилятор может выполнить аналогичную оптимизацию для первой версии ... поскольку он может знать, что конструктор String()
не имеет побочных эффектов. Однако обратите внимание, что эти оптимизации применяются только в тех случаях, когда инициализация не требуется. JIT-компилятору не разрешается оптимизировать new String()
до ""
..., поскольку они на самом деле означают разные вещи.