2017-10-04 6 views
0

Ma méthode ci-dessous doit renvoyer une chaîne concaténée à partir de chaînes.Pourquoi String est préférable à StringBuilder en concaténation?

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

return sb.toString(); 

En IntelliJ, le code d'inspection me suggère de remplacer ce StringBuilder avec une chaîne comme ci-dessous:

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

Mon impression est que StringBuilder doit être utilisé avec la méthode append, pour remplacer concaténation de chaîne avec le signe plus. Cette suggestion d'inspection de code a-t-elle un sens dans IntelliJ?

+0

double possible de [ StringBuilder vs String concaténation dans toString() en Java] (https://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java) – Meo

+0

Littéralement, juste googlé le titre ... – Meo

Répondre

1

Vous avez raison dans vos présomptions que la plupart des inspections IntelliJ vous encouragent à faire les choses de façon "meilleure".

Cependant, ce n'est pas toujours le cas. Surtout lorsque certaines inspections fonctionnent «dans les deux sens» -> vous devrez exercer votre propre jugement sur ce qui est «meilleur».

Dans ce cas, si vous commencez avec une chaîne concaténée normale:

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

Il y a quelques inspections disponibles - curseur mis sur "count: " et appuyez sur Alt-Entrée:

  1. Remplacer « + 'avec String.format()
  2. Remplacer '+' avec StringBuilder.append()
  3. Remplacer '+' avec java.text.MessageFormat.format()

Si vous choisissez l'option (2), vous obtenez ceci:

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

Maintenant, vous pouvez utiliser alt-entrer à nouveau pour choisir "Remplacer StringBuilder avec la chaîne" inverser le changement.

Dans ce cas, vous avez découvert une inspection/refactoring bidirectionnelle: cela fonctionne dans les deux sens. D'autres refactorings (tels que "Encapsulate") ne fonctionnent que d'une seule façon.

Quant à ce qui est « meilleur » - vous devez peser les performances de StringBuilder par rapport à la lisibilité et la simplicité, et faire ce jugement vous - IntelliJ est simplement fournir des inspections à portée de main pour vous aider;)

+0

+1 pour le changement de côté du titre de la question (qui est abordé dans de nombreux autres endroits :) et qui aborde plutôt cet aspect: "Cette suggestion d'inspection de code a-t-elle un sens ...?" très bien. – glytching

+0

@glitch sauf qu'il ne répond pas vraiment à la question car il n'explique pas quand StringBuilder doit être utilisé, ce qui est la raison pour laquelle OP est confus. – Meo

+0

La description de l'inspection dans IntelliJ indique clairement "L'utilisation d'une concaténation de chaîne rend le code plus court et plus simple.Cette inspection indique uniquement si la concaténation résultante est au moins aussi efficace ou efficiente que le code StringBuffer ou StringBuilder original." – Meo