簡體   English   中英

測試返回字符串是否為 Java 中的 null 的最佳方法

[英]The best way to test if a returned string is null in Java

我有一個 function 連接一組這樣的字符串:

StringBuffer sb = new StringBuffer();

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

其中 fct1()、fct2() 和 fct3() 應該返回一個字符串。 問題是我必須像這樣測試返回的值:

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

因為如果值為 null,我會得到一個異常。

問題是我有很多這樣的指令,最重要的是,我無法修改這些返回字符串的函數(fct1、fct2 和 fct3)。

有沒有一種解決方案可以自動“清理”我的字符串?

謝謝你。

PS:我創建了一個 function 可以做到:

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

這樣我就可以這樣稱呼它:

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

另一種選擇可能是

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

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

如果您不介意引入依賴項,請使用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());

注意 一般來說,除非您需要StringBuffer的線程安全,否則您應該使用StringBuilder 同樣的API,性能更好。

除了縮短方法名稱之外,您無法做任何事情來簡化此解決方案。 (可能有一個使用面向方面編程的解決方案,但總的來說我並不認為這更簡單。)

不幸的是,您使用testNullity()的解決方案是使用 Java 可以獲得的最佳解決方案(盡管考慮更好的命名)。 事實上,已經有一種方法可以做到這一點: StringUtils.html#defaultString

您可以圍繞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(); }
}

標准 API 中沒有這樣的 function,盡管某些方法(可以做其他事情)內置了它。

例如, System.getProperty()有一個變量,它采用默認值,如果找不到給定的屬性,它將不會返回null ,而是返回給定的默認值。 如果有意義的話,您可能會考慮為您的fct*方法提供這樣的“默認”參數。

我認為 C# 有一個?? 與您想要的操作符(您會調用sb.append(fct2()?? "") ),但我想 Java 不會很快添加任何新的操作符。

您檢查 function 的更好變體是:

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

如果 append 沒有任何內容,這可以避免使用空字符串進行多余的 append 調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM