![](/img/trans.png)
[英]What is the best way to check string not null and not empty in Java?
[英]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;
}
}
如果您不介意引入依賴項,請使用Guava的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());
注意 一般來說,除非您需要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.