测试返回的字符串在Java中是否为null的最佳方法

时间:2011-06-14 19:59:57

标签: java string

我有一个连接一组字符串的函数,如下所示:

StringBuffer sb = new StringBuffer();

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

其中fct1(),fct2()和fct3()应该返回一个String。 问题是我必须像这样测试返回的值:

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

因为如果值为null,我会收到异常。

问题是我有很多这样的指令,最重要的是,我无法修改这些返回字符串的函数(fct1,fct2和fct3)。

是否有解决方案可以自动“清理”我的字符串?

谢谢。

PS:我创建了一个可以做到的功能:

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

所以我可以这样称呼它:

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

6 个答案:

答案 0 :(得分:4)

另一种选择可能是

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

    public SafeStringBuilder append(String s) {
        if (s != null) 
            builder.append(s);
        return this;
    }
 }

答案 1 :(得分:1)

如果您不介意引入依赖关系,请使用GuavaJoiner代替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,更好的性能。

答案 2 :(得分:0)

除了缩短方法名称之外,没有任何其他方法可以使此解决方案更简单。 (可能有使用面向方面编程的解决方案,但总的来说我并不认为这更简单。)

答案 3 :(得分:0)

不幸的是,使用testNullity()的解决方案是Java可以获得的最佳解决方案(尽管考虑更好的命名)。事实上,已经有一种方法可以做到:StringUtils.html#defaultString

答案 4 :(得分:0)

您可以围绕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(); }
}

答案 5 :(得分:0)

标准API中没有这样的功能,虽然有些方法(做其他事情)内置了它。

例如,System.getProperty()有一个采用默认值的变体,如果它找不到给定的属性,它将不会返回null,而是返回给定的默认值。您可能会考虑为fct*方法提供这样一个“默认”参数,如果它有效。

我认为C#有一个??运算符可以满足您的需求(您可以调用sb.append(fct2() ?? "")),但我认为Java不会很快添加任何新的运算符。

检查功能的一个更好的变体是:

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

如果没有要追加的内容,这可以避免使用空字符串进行多余的追加调用。