Лучший способ проверить, является ли возвращаемая строка нулевой в Java - PullRequest
3 голосов
/ 14 июня 2011

У меня есть функция, которая объединяет набор строк следующим образом:

StringBuffer sb = new StringBuffer();

sb.append(fct1());
sb.append(fct2());
sb.append(fct3());

Где fct1 (), fct2 () и fct3 () должны возвращать строку. Проблема в том, что я должен проверить возвращаемые значения следующим образом:

sb.append(fct1() == null ? "" : fct1());

потому что я получаю исключение, если значение равно нулю.

Проблема в том, что у меня много подобных инструкций, и, прежде всего, я не могу изменить эти функции, которые возвращают строки (fct1, fct2 и fct3).

Есть ли решение, которое автоматически "санирует" мои строки?

Спасибо.

PS: я создал функцию, которая может это сделать:

public String testNullity(String aString){
aString == null ? "" : aString;
}

чтобы я мог назвать это так:

sb.append(testNullity(fct1));
sb.append(testNullity(fct2));
...

Ответы [ 6 ]

4 голосов
/ 15 июня 2011

Другой альтернативой может быть

 public class SafeStringBuilder  {
    private StringBuilder builder = new StringBuilder();

    public SafeStringBuilder append(String s) {
        if (s != null) 
            builder.append(s);
        return this;
    }
 }
1 голос
/ 15 июня 2011

Если вы не возражаете против введения зависимости, используйте Гуава Joiner вместо StringBuffer:

Joiner j = Joiner.on("").skipNulls();
StringBuilder sb = new StringBuilder();
j.appendTo(sb, fct1());
j.appendTo(sb, fct2());
j.appendTo(sb, fct3());
String result = sb.toString();

// or even just
Joiner j = Joiner.on("").skipNulls();
String result = j.join(fct1(), fct2(), fct3());

N.B. В общем, если вам не нужна защита потоков StringBuffer, вы должны использовать StringBuilder. Тот же API, лучшая производительность.

0 голосов
/ 15 июня 2011

В стандартном API такой функции нет, хотя некоторые методы (которые выполняют другие функции) имеют встроенную функцию.

Например, System.getProperty () имеет варианткоторый принимает значение по умолчанию, и если он не может найти данное свойство, он не вернет null, но данное значение по умолчанию.Вы можете подумать о предоставлении вашим fct* методам такого аргумента «по умолчанию», если он имеет смысл.

Я думаю, что в C # есть оператор ??, который делает то, что вы хотите (вы бы назвали sb.append(fct2() ?? "")), но я предполагаю, что Java не будет добавлять новые операторы в ближайшее время.

Лучшим вариантом вашей функции проверки будет следующий:

public void appendIfNotNull(StringBuffer sb, String s) {
    if(s != null) {
       sb.append(s);
    }
}

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

0 голосов
/ 15 июня 2011

Вы можете создать свою собственную оболочку вокруг StringBuffer:

class MyStringBuffer {
    StringBuffer _sb = new StringBuffer();
    public boolean append(String s) {
        _sb.append(s==null ? "" : s);
        return s == null;
    }
    public String toString() { return _sb.toString(); }
}
0 голосов
/ 15 июня 2011

К сожалению, ваше решение с testNullity() - лучшее, что вы можете получить с помощью Java (хотя лучше подумайте об именах). Фактически, уже есть метод, который делает это: StringUtils.html # defaultString .

0 голосов
/ 15 июня 2011

Нет ничего, что вы можете сделать, чтобы упростить это решение, кроме сокращения имени метода. (Может быть решение с использованием аспектно-ориентированного программирования, но в целом я не считаю это более простым.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...