Строковая инициализация Java

Которые делают Вы предпочитаете и почему"

String myString = null;
if(someCondition)
   myString = "something";
else
   myString = "something else";

ИЛИ

String myString = "";
if(someCondition)
   myString = "something";
else
   myString = "something else";

Я знаю что с помощью троичного (? оператор :) возможен, но я хотел бы знать о вышеупомянутых двух.

11
задан IAdapter 23 July 2010 в 22:28
поделиться

7 ответов

Neither. Вместо этого вот это:

String myString;
if (someCondition)
   myString = "something";
else
   myString = "something else";

В обоих ваших альтернативах переменная инициализируется значением, которое никогда не будет прочитано. Тот факт, что она вообще присутствует, вводит в заблуждение.

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

27
ответ дан 3 December 2019 в 01:24
поделиться
String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)
0
ответ дан 3 December 2019 в 01:24
поделиться

Я предпочитаю первый, потому что String myString = "" создаст дополнительный объект в пуле

-2
ответ дан 3 December 2019 в 01:24
поделиться
String mystring = null;
mystring.length() 
// Cause error

Выше будет ошибка из-за нулевого указателя.

string myString = new String();
myString.length()
// will not cause error

Мне нравится использовать позже, но я думаю, что это личные предпочтения.

-2
ответ дан 3 December 2019 в 01:24
поделиться

Как насчет этого следующего кода, в любом случае он хочет что-то установить.

String myString = (someCondition)  ? "something " : "else something";

или this

String myString = "else something"; 

if (someCondition)
   myString = "something";

в приведенном выше случае, если вы на 90% уверены, что someCondition всегда истинно. в противном случае создание ненужного объекта в объявлении. Ожидание комментариев от гуру.

-2
ответ дан 3 December 2019 в 01:24
поделиться

Шаг инициализации не является необходимым и может запутать будущих читателей.

Мое личное мнение заключается в том, что такая переменная должна присваиваться только один раз, поэтому она является идеальным кандидатом для ключевого слова final.

final String myString;
if (someCondition) {
   myString = "something";
} else {
   myString = "something else";
}

Обратите внимание, что определение myString не включает присвоение (поскольку это запретило бы последующие присвоения) и что после присвоения она доступна только для чтения. Это обеспечивает надежность кода и более четко показывает ваше намерение.

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

2
ответ дан 3 December 2019 в 01:24
поделиться

Идиоматический способ - использовать тернарный / условный оператор ( JLS 15.25 ):

String myString = (someCondition ? "something" : "something else");

Но вы также можете сделать более подробный if-else , если вы действительно чувствуете, что должны:

final String myString;
if(someCondition) {
   myString = "something";
} else {
   myString = "something else";
}

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


Почему final ?

Смысл final в приведенном выше фрагменте состоит в том, чтобы показать, что конструкция if-else будет присвоена ] myString один раз и ровно один раз во всех возможных путях выполнения. Это основная идея предлагаемого решения if-else : если вы собираетесь присвоить значение локальной переменной только один раз, даже если это может быть одна из нескольких возможностей, сделайте это final для повышения удобочитаемости.

Сравните это с этим «альтернативным» предложением, например:

// DON'T DO THIS! Example only!
String myString = "something else";
if (someCondition) myString = "something";

С этой конструкцией вы можете назначать myString дважды, поэтому вы не можете поместить здесь final даже если не было дальнейшего переназначения. Вы также не могли поместить final ни в одно из исходных предложений = null; или = ""; , и это одна из основных причин, почему они не рекомендуется.

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

Ссылки


Резюме

  • Не «инициализируйте» локальную переменную только ради этого, если вы все равно собираетесь ее перезаписать
    • Пусть он будет неинициализирован, чтобы компилятор мог помочь вам определить возможную ошибку, указав на любое использование переменной, пока она еще не инициализирована.
    • Если код компилируется, то переменной назначается «реальное» значение хотя бы один раз перед всеми использованиями
  • Если вам не нужно переназначать локальную переменную, сделайте ее окончательной , чтобы улучшить читаемость
    • final немедленно заверяет читателей, что дальнейшие переназначения невозможны
    • Компилятор может помочь вам предотвратить ошибку последующего переназначения
    • Если код компилируется, тогда переменная присваивается «реальное» значение ровно один раз перед всеми использованиями
  • В общем, вы должны позволить компилятору помочь вам написать лучший, наиболее читаемый код.
18
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

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