[[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 StringBuilderinstancia. Luego, +=usa otra StringBuilderinstancia. 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 StringBuilderes cuando estoy construyendo una cadena a partir de varias llamadas a métodos. Entonces puedo crear métodos que tengan un StringBuilderargumento:
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á StringBuilderque 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.
PreparedStatemento algo similar: docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html