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