Строка инициализации Java - PullRequest
11 голосов
/ 23 июля 2010

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

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

OR

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

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

Ответы [ 7 ]

27 голосов
/ 23 июля 2010

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

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

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

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

18 голосов
/ 23 июля 2010

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

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

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

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; или = "";, и это одна из основных причин, по которой они не рекомендуются.

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

Ссылки


Сводка

  • Не "инициализировать" aлокальная переменная просто для того, чтобы сделать это, если вы все равно собираетесь ее перезаписать
    • Пусть она не будет инициализирована, так что компилятор может помочь вам определить возможную ошибку, указав любуюиспользование переменной, пока она еще не инициализирована
    • Если код компилируется, тогда переменной присваивается «реальное» значение хотя бы один раз , прежде чем все ее значения
  • Если вам не нужно переназначать локальную переменную, сделайте ее final для улучшения читабельности
    • final немедленно убеждает читателей, что дальнейшие переназначения невозможны
    • компилятор может помочь вам предотвратить ошибку Sпоследующее переназначение
    • Если код компилируется, то переменной присваивается «реальное» значение ровно один раз , прежде чем все его значения
  • Вообще говоря, вы должен позволить компилятору помочь вам написать лучший, наиболее читаемый код.
2 голосов
/ 23 июля 2010

На этапе инициализации нет необходимости, и это может сбить с толку будущих читателей.

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

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

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

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

0 голосов
/ 24 июля 2010

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

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

или это

String myString = "else something"; 

if (someCondition)
   myString = "something";

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

0 голосов
/ 23 июля 2010
String mystring = null;
mystring.length() 
// Cause error

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

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

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

0 голосов
/ 23 июля 2010

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

0 голосов
/ 23 июля 2010
String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)
...