[[Hay algunas buenas respuestas aquí, pero encuentro que todavía les falta un poco de información. ]]
return (new StringBuilder("select id1, " + " id2 " + " from " + " table"))
.toString();
Entonces, como señala, el ejemplo que da es simplista, pero analicémoslo de todos modos. Lo que sucede aquí es que el compilador realmente hace el +
trabajo aquí porque "select id1, " + " id2 " + " from " + " table"
son todas constantes. Entonces esto se convierte en:
return new StringBuilder("select id1, id2 from table").toString();
En este caso, obviamente, no tiene sentido usar StringBuilder
. También podrías hacer:
return "select id1, " + " id2 " + " from " + " table";
Sin embargo, incluso si estuviera agregando campos u otras no constantes, el compilador usaría un interno StringBuilder
; no es necesario que defina uno:
return "select id1, " + fieldName + " from " + tableName;
Bajo las sábanas, esto se convierte en un código que es aproximadamente equivalente a:
StringBuilder sb = new StringBuilder("select id1, ");
sb.append(fieldName).append(" from ").append(tableName);
return sb.toString();
Realmente, la única vez que necesita usar StringBuilder
directamente es cuando tiene código condicional. Por ejemplo, el código que se parece a lo siguiente está desesperado por un StringBuilder
:
String query = "select id1, " + fieldName + " from " + tableName;
if (where != null) {
query += ' ' + where;
}
El +
de la primera línea usa una StringBuilder
instancia. Luego, +=
usa otra StringBuilder
instancia. Es más eficiente hacer:
StringBuilder sb = new StringBuilder(64);
sb.append("select id1, ").append(fieldName).append(" from ").append(tableName);
if (where != null) {
sb.append(' ').append(where);
}
return sb.toString();
Otra ocasión en la que utilizo un StringBuilder
es cuando estoy construyendo una cadena a partir de varias llamadas a métodos. Entonces puedo crear métodos que tengan un StringBuilder
argumento:
private void addWhere(StringBuilder sb) {
if (where != null) {
sb.append(' ').append(where);
}
}
Cuando esté usando a StringBuilder
, debe estar atento a cualquier uso de +
al mismo tiempo:
sb.append("select " + fieldName);
Eso +
hará StringBuilder
que se cree otro interno . Por supuesto, esto debería ser:
sb.append("select ").append(fieldName);
Por último, como señala @TJrowder, siempre debe adivinar el tamaño del StringBuilder
. Esto ahorrará en la cantidad de char[]
objetos creados al aumentar el tamaño del búfer interno.
PreparedStatement
o algo similar: docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html