Инициализация строки Java

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

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

ИЛИ

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)

Ответ 5

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

Ответ 6

String mystring = null;
mystring.length() 
// Cause error

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

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

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

Ответ 7

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

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

или

String myString = "else something"; 

if (someCondition)
   myString = "something";

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