Строка инициализации Java (часть 2)

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

String aString = ""; // Or = null ?
if(someCondition)
   aString = "something";

return aString;

В этом случае строка должна быть инициализирована, чтобы вернуть ее. Я всегда думал, что любой из этих вариантов (установка его на "" или "ноль" выглядит отчасти уродливой. Мне просто было интересно, что здесь делают другие... или это больше просто вопрос, хотите ли вы, чтобы пустая строка или ноль передавались вокруг в вашей программе (и если вы готовы обрабатывать либо)?

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

7 ответов

Решение

Зависит от того, чего вы хотите достичь,

в общем, я бы возвратил нуль, чтобы сигнализировать, что ничего не было обработано, позже могут появиться случаи, когда someCondition имеет значение true, но строка, которую вы строите вместе, в любом случае "", таким образом, вы можете отличаться от этого случая, если вы возвращаете ноль, если ничего не было обработано,

т.е.

String aString = null;
if(someCondition)
  aString = "something";

return aString;

но все это на самом деле зависит от того, чего вы хотите достичь... например, если код предполагает сборку строки, которая доставляется непосредственно в пользовательский интерфейс, вы бы вместо этого использовали ""

return (someCondition) ? "something" : "";

или же

return (someCondition) ? "something" : null;

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

Так как вы спрашиваете наше мнение...

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

Что касается причины (1), я предпочитаю избегать вложенных if, но иногда вы наследуете код с большим количеством if.

if(someCondition)
   aString = "something";
else
   aString = "";

Я бы предпочел "ноль", потому что это приведет к сбою приложения и сбросу стека, за которым я могу следить. Напротив, пустая строка сохранит ход событий. Естественно, от логики вашего кода зависит, что лучше: ноль или "".

В этом случае может быть лучше сделать что-то вроде:

public void func() {
    boolean condition = getConditionFromSomewhere();
    String condString = getAppropriateValue(condition);
}

public String getAppropriateValue(boolean condition) {
    if (condition) {
        return "something";
    } else {
        return "somethingElse";
    }
}

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

Это просто ваше предпочтение того, что должен делать ваш API. Если вы возвращаете нуль, может быть шанс, что пользователи API могут получить NPE, если они не проверяют ноль. Но если вы используете строку "", ошибка может пройти бесшумно, если она не должна быть нулевой. Это предпочтение того, как вы пишете свой API и зависит от варианта использования.

Да, это просто вопрос, хотите ли вы, чтобы в вашей программе передавалась пустая или пустая строка. Если вы планируете добавить вещи к нему позже, и someCondition просто указывает, что вы должны дать ему первое значение для начала, а затем использовать пустую строку. Если вы планируете, чтобы это указывало на наличие строки или ее отсутствие, возможно, лучше использовать null.

Размышляя об этом, я редко использую "" в коде для любых целей.

Другие вопросы по тегам