[英]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.