Инициализация строки 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 всегда верна. иначе ненужное создание объекта в декларации. Ознакомиться с комментариями Гуру.