Строка инициализации 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 = ""
создаст дополнительный объект в пуле