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

Что вы предпочитаете и почему?

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

ИЛИ ЖЕ

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

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

7 ответов

Решение

Ни. Вместо этого это:

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

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

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

Идиоматическим способом является использование троичного / условного оператора ( 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 улучшить читаемость
    • final немедленно заверяет читателей, что дальнейшие переназначения невозможны
    • Компилятор может помочь вам предотвратить ошибку при переназначении
    • Если код компилируется, то переменной присваивается "реальное" значение ровно один раз, прежде чем все пользователи
  • Вообще говоря, вы должны позволить компилятору помочь вам написать лучший, наиболее читаемый код.

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

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

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

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

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

String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)
String mystring = null;
mystring.length() 
// Cause error

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

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

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

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

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

или это

String myString = "else something"; 

if (someCondition)
   myString = "something";

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

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

Другие вопросы по тегам