2011-06-14 11 views
3

我有一個連接一組字符串這樣的功能:最好的方法,如果返回的字符串爲null在Java中

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:我創建了一個功能,可以做到這一點:

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

,這樣我可以這樣調用:

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

StringBugger?這是一個新班嗎? :-) – mdm 2011-06-14 20:01:50

+0

那麼爲什麼你的解決方案不適合你? – Malcolm 2011-06-14 20:03:30

+0

@Howard StringBuffer的是最終 – 2011-06-14 20:09:39

回答

4

另一種方法是

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

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

很喜歡這個建議。 – Marcelo 2011-06-14 20:10:19

+2

除了'StringBuilder'是'final'外,這是一個不錯的主意。 (請使用代表團。) – 2011-06-14 20:10:50

+0

不起作用,StringBuilder爲final。嘗試包裝解決方案! (編輯:+1聖保羅的比我快11秒:))當然 – s106mo 2011-06-14 20:11:01

0

沒有什麼任何你可以做,使該解決方案更簡單除了縮短方法名稱。 (有可能是使用面向方面編程解決方案,但整體來說,我真的不認爲簡單的。)

0

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

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(); } 
} 
0

有標準的API中沒有這樣的功能,雖然一些方法(它做其他事情)有它建於

例如。 ,System.getProperty()有一個採用默認值的變體,如果找不到給定屬性,則不會返回null,而是返回給定的默認值。你可能會考慮爲你的fct*方法提供這樣一個「默認」的參數,如果這樣做的話。

我認爲C#有一個??運算符,可以實現你想要的功能(你可以調用​​),但是我猜Java不會很快添加任何新的運算符。

您檢查功能的更好的方法是這樣的:

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

這避免瞭如果有什麼要追加一個空字符串多餘的附加調用。

1

如果你不介意引進的依賴,使用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,更好的性能。

相關問題