簡體   English   中英

Java字符串串聯-有更好的方法嗎?

[英]Java string concatenation - is there a better way?

只是一個簡單的表格問題。 在下面的代碼中,有沒有更好的方法來隱藏字符串(即,我是否可以將tmpError設置為等於新字符串而不是將其添加?)

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

提前致謝

使用StringBuilder可以很容易地提高效率。

由於String ,每當您對字符串串聯使用加法( + )運算符時,都會分配一個新的String對象(使用String.concat()時也會如此)。

StringBuilder保留一個內部字符數組,以便在該數組上進行串聯操作,並且在調用其toString()方法時僅分配一個String對象。 使用其append()方法將文本附加到String的末尾,並使用偏移量為0的insert()附加文本。

但是,您還應該考慮可讀性。 Dasblinkenlight在他的回答中指出了一個很好的觀點。 正如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());
    }
}

我總是建議使用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());
    }
}

您可以使用+= (添加/串聯和賦值)運算符:

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

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

但是,這是錯誤報告代碼,僅在代碼檢測到編程錯誤時才執行。 在這種情況下,效率並不重要,因為首先不應該發生這種情況。 使用您認為更容易理解的任何內容。

像這樣做:

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

或者,您可以使用Xavi指出的StringBuilder ,但對我來說,只有在將文本附加到某種循環中時才有意義。

連接兩個字符串的最快方法是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);
    }
}

除了上面的任何一個,您可能想要使用Guava Preconditions 然后,您可以編寫如下代碼:

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被拋出。 它可能不像您最初的解決方案那么簡潔,但是您的意圖在語義上是顯而易見的。

我會做以下公共無效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());
    }
}

暫無
暫無

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

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