2013-03-21 54 views
0

只是一個快速的形式問題。在下面的代碼,有沒有更好的方式來concatinate字符串(即我能不能設置tmpError等於新的字符串,而不是增加了?)Java字符串連接 - 有更好的方法嗎?

public void validate() throws Exception { 
    String tmpError = ""; 
    if(paramA == null) tmpError = tmpError + "paramA was not set"; 

    if(paramB == null) tmpError = tmpError + "paramB was not set"; 

    if(paramC == null) tmpError = tmpError + "paramC was not set"; 


    if(!tmpError.equalsIgnoreCase("")){ 
     tmpError = "error occured" + tmpError; 
     throw new Exception(tmpError); 
    } 
} 

在此先感謝

回答

4

我總是建議使用StringBuilder的

是這樣的:

public void validate() throws Exception { 
    StringBuilder error = new StringBuilder(); 
    if(paramA == null) 
     error.append("paramA was not set"); 

    if(paramB == null) 
     error.append("paramB was not set"); 

    if(paramC == null) 
     error.append("paramC was not set"); 


    if(error.length() > 0) { 

     throw new Exception("error occured " + error.toString()); 
    } 
} 
+0

我喜歡你的答案,但我會考慮它,所以你只追加「paramA」,「paramB」和「paramC」。然後我會拋出「錯誤 - 參數未設置:」+ error.toString()。 – Sparky 2013-03-21 10:53:38

1

可以使用+=(添加/級聯和分配)操作符:

if(paramA == null) tmpError += "paramA was not set"; 
4

它可以方便地在效率通過使用StringBuilder改善。

由於對String不可改變的天性,每次使用添加時間(+)運營商字符串連接,一個新的String對象分配(使用String.concat()時也一樣)。

StringBuilder保持內部字符數組,使聯接操作該陣列上的工作,當你調用它的toString()方法只有一個String對象分配。使用它的append()方法將文本附加到字符串的末尾,並使用insert()的偏移量0來預先添加文本。

但是,您還應該考慮到可讀性。 Dasblinkenlight在他的answer中提到了一個很好的觀點。正如Anthony已經指出的那樣,您還可以使用+=複合賦值運算符來增強可讀性。

public void validate() throws Exception { 
    StringBuilder tmpError = new StringBuilder(); 
    if(paramA == null) tmpError.append("paramA was not set"); 

    if(paramB == null) tmpError.append("paramB was not set"); 

    if(paramC == null) tmpError.append("paramC was not set"); 


    if(tmpError.length() > 0){ 
     tmpError.insert(0,"error occured"); 
     throw new Exception(tmpError.getString()); 
    } 
} 
+1

最好使用StringBuilder類的'length()'方法來檢查它是否爲空,而不是將它與空字符串相比較。 – 2013-03-21 10:51:33

1

這樣做效率不高,因爲在缺少所有三個參數的情況下,您將創建四個字符串對象。你最好追加到一個StringBuilder對象。

但是,這是錯誤報告代碼,只有當您的代碼檢測到編程錯誤時纔會執行。效率在這種情況下並不重要,因爲它們不應該首先發生。使用你認爲更容易理解的內容。

1

做這樣的:

public void validate() throws Exception { 
    String tmpError = ""; 
    if(paramA == null) tmpError += "paramA was not set"; 

    if(paramB == null) tmpError += "paramB was not set"; 

    if(paramC == null) tmpError += "paramC was not set"; 


    if(!tmpError.equalsIgnoreCase("")){ 
     tmpError = "error occured" + tmpError; 
     throw new Exception(tmpError); 
    } 
} 

,或者也可以使用由哈維指出了StringBuilder但對我來說,只會是有意義的,如果你附加某種循環內的文本。

0

我會做一些如下 公共無效的validate()拋出異常{

public void validate() throws Exception { 
    String tmpError = ""; 
    if(paramA == null) tmpError += "paramA was not set"; 
    if(paramB == null) tmpError += "paramB was not set"; 
    if(paramC == null) tmpError += "paramC was not set"; 

    if(!(tmpError.trim()).equalsIgnoreCase("")){ 
     tmpError = "error occured" + tmpError; 
     throw new Exception(tmpError); 
    } 
} 

見我用+=並檢查其空之前修剪tmpError變量。

我不認爲你在這裏不需要太擔心StringBuilder,因爲在這種情況下沒有太多內存在被處理。

如果您在StringBuilder的堅持,那麼你可以做一些事情,如下

public void validate() throws Exception { 
    StringBuilder sb = new StringBuilder(); 
    if(paramA == null) sb.append("paramA was not set"); 
    if(paramB == null) sb.append("paramB was not set"); 
    if(paramC == null) sb.append("paramC was not set"); 

    if(!(sb.toString().trim()).equalsIgnoreCase("")){ 
     sb.Insert(0,"error occured"); 
     throw new Exception(sp.toString()); 
    } 
} 
1

的最快方法串聯兩個字符串是String類的concat函數。

public void validate() throws Exception { 
    String tmpError = ""; 

    if(paramA == null) tmpError = tmpError.concat("paramA was not set"); 
    if(paramB == null) tmpError = tmpError.concat("paramB was not set"); 
    if(paramC == null) tmpError = tmpError.concat("paramC was not set"); 
    if(!tmpError.equalsIgnoreCase("")){ 
     tmpError = "error occured".concat(tmpError); 
     throw new Exception(tmpError); 
    } 
} 
+0

'concat()'將在每次調用時創建一個新的'String'對象,就像'+'會。 – 2013-03-21 11:01:44

1

比任何上述的相反,你可能需要使用GuavaPreconditions。然後你可以這樣寫代碼:

import static com.google.common.base.Preconditions.*; 
... 
public void doSomething(String strA, String strB) { 
    checkNotNull(strA, "strA is missing"); 
    checkArgument(strB.length() >= 6, "strB is too short"); 
    ... 
} 

如果檢查失敗,則會拋出一個Exception。它可能不像你最初的解決方案那麼簡潔,但你的意圖在語義上是明顯的。