Которые делают Вы предпочитаете и почему"
String myString = null;
if(someCondition)
myString = "something";
else
myString = "something else";
ИЛИ
String myString = "";
if(someCondition)
myString = "something";
else
myString = "something else";
Я знаю что с помощью троичного (? оператор :) возможен, но я хотел бы знать о вышеупомянутых двух.
Neither. Вместо этого вот это:
String myString;
if (someCondition)
myString = "something";
else
myString = "something else";
В обоих ваших альтернативах переменная инициализируется значением, которое никогда не будет прочитано. Тот факт, что она вообще присутствует, вводит в заблуждение.
Я бы на самом деле использовал условный оператор, конечно - но, несмотря на это, приведенный выше вариант лучше.
String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)
Я предпочитаю первый, потому что String myString = ""
создаст дополнительный объект в пуле
String mystring = null;
mystring.length()
// Cause error
Выше будет ошибка из-за нулевого указателя.
string myString = new String();
myString.length()
// will not cause error
Мне нравится использовать позже, но я думаю, что это личные предпочтения.
Как насчет этого следующего кода, в любом случае он хочет что-то установить.
String myString = (someCondition) ? "something " : "else something";
или this
String myString = "else something";
if (someCondition)
myString = "something";
в приведенном выше случае, если вы на 90% уверены, что someCondition всегда истинно. в противном случае создание ненужного объекта в объявлении. Ожидание комментариев от гуру.
Шаг инициализации не является необходимым и может запутать будущих читателей.
Мое личное мнение заключается в том, что такая переменная должна присваиваться только один раз, поэтому она является идеальным кандидатом для ключевого слова final
.
final String myString;
if (someCondition) {
myString = "something";
} else {
myString = "something else";
}
Обратите внимание, что определение myString не включает присвоение (поскольку это запретило бы последующие присвоения) и что после присвоения она доступна только для чтения. Это обеспечивает надежность кода и более четко показывает ваше намерение.
Обратите также внимание, что я верю в скобки даже для отдельных строк. Возможно, это привычка Perl, но если вы этого не сделаете, то когда-нибудь это вас подкосит.
Идиоматический способ - использовать тернарный / условный оператор ( 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
немедленно заверяет читателей, что дальнейшие переназначения невозможны