2017-10-04 49 views
0

我的下面的方法需要返回從字符串連接的字符串。爲什麼字符串更適合串聯的StringBuilder?

StringBuilder sb = new StringBuilder(); 
sb.append("count: ").append(this.count()).append("\n"); 

return sb.toString(); 

在的IntelliJ,代碼檢查表明我有一個字符串像下面來取代這個StringBuilder的:

String sb = "count: " + this.count() + "\n"; 
return sb 

我的印象是StringBuilder的應該追加方法一起使用,來代替字符串連接帶加號。這種代碼檢查建議是否在IntelliJ中有意義?

+0

的可能的複製[在Java中的toString()中的StringBuilder vs字符串串聯)(https://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java) – Meo

+0

字面上只是使用標題... – Meo

回答

1

你在你的推定,大部分的IntelliJ 檢查鼓勵你做的事情在一個「更好」的方式是正確的。

但是,情況並非總是如此。特別是在某些檢查「雙向」工作的情況下 - >您必須對「更好」的情況進行自己的判斷。

在這種情況下,如果你以一個正常的連接字符串:

return "count: " + count + "\n"; 

有可用的幾個檢查 - 把光標放在"count: "並按下Alt-輸入:

  1. 替換「+ '用String.format()
  2. 用StringBuilder替換'+'()
  3. 用java.text.MessageFormat.format()替換'+'

如果選擇選項(2),你會得到這樣的:

return new StringBuilder().append("count: ").append(count).append("\n").toString(); 

現在,你可以再次使用ALT輸入選擇「與字符串替換StringBuilder的」反向的變化。

在這種情況下,您發現了一個雙向檢查/重構:它可以雙向運行。其他重構(如「封裝」)只能以一種方式工作。

至於什麼是「更好」 - 你必須權衡的StringBuilder與可讀性和簡單的性能,並作出判斷自己 - 的IntelliJ只是提供方便的檢查,以幫助你;)

+0

對於側面的問題標題(在_numerous_其他地方提到:)而不是這個問題:「這個代碼檢查建議是否合理......?」非常整潔。 – glytching

+0

@ glitch除了它沒有真正回答這個問題,因爲它沒有解釋什麼時候應該使用StringBuilder,這就是OP令人困惑的原因。 – Meo

+0

Aldo在IntelliJ中對檢查的描述清楚地表明:「使用字符串連接可以使代碼變得更短更簡單,只有當結果串聯的效率至少與原始StringBuffer或StringBuilder代碼一樣高效時,纔會報告。」 – Meo

相關問題