Hay que equilibrar la legibilidad y funcionalidad.
Digamos que usted tiene lo siguiente:
String str = "foo";
str += "bar";
if(baz) str += "baz";
Esto creará 2 constructores de cadena (en la que sólo necesita 1, en realidad) más un objeto de cadena adicional para el ínterin. Usted sería más eficiente si se fue:
StringBuilder strBuilder = new StringBuilder("foo");
strBuilder.append("bar");
if(baz) strBuilder.append("baz");
String str = strBuilder.toString();
embargo, como cuestión de estilo, creo que la primera de ellas se ve muy bien. El beneficio de rendimiento de la creación de un solo objeto parece muy mínimo para mí.Ahora, si en lugar de 3 cuerdas, tuvieras 10, o 20, o 100, diría que el rendimiento supera el estilo. Si estuviera en un bucle, seguro usaría el generador de cadenas, pero creo que solo un par de cadenas está bien para hacer la manera 'descuidada' de hacer que el código se vea más limpio. Pero ... ¡esto tiene una trampa muy peligrosa al acecho! Lea a continuación (pausa para crear suspenso ... dun dun dunnnn)
Hay quienes dicen que siempre use el generador de cadenas explícito. Una de las razones es que su código seguirá creciendo, y generalmente lo hará de la misma manera que ya lo está (es decir, no se tomarán el tiempo para refactorizar). Así que terminará con esas 10 o 20 declaraciones cada una de ellas creando su propio constructor cuando no es necesario. Para evitar esto desde el principio, dicen que siempre usan un constructor explícito.
Por lo tanto, en su ejemplo, no va a ser particularmente rápido, cuando alguien en el futuro decide que quiere una extensión de archivo al final, o algo así, si continúa utilizando la concatenación de cadenas en lugar de un StringBuilder, finalmente se encontrarán con problemas de rendimiento.
También tenemos que pensar en el futuro. Digamos que usted hacía atrás en el código Java JDK 1.1 y que tenía el siguiente método:
public String concat(String s1, String s2, String s3) {
return s1 + s2 + s3;
}
En ese momento, habría sido lento debido a StringBuilder no existiera.
Luego, en JDK 1.3 decidiste hacerlo más rápido usando StringBuffer (StringBuilder todavía no existe). Esto se hace:
public String concat(String s1, String s2, String s3) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return sb.toString();
}
Se vuelve mucho más rápido. ¡Increíble!
Ahora JDK 1.5 que sale, y con él viene StringBuilder (que es más rápido que StringBuffer) y el transation automática de
return s1 + s2 + s3;
a
return new StringBuilder().append(s1).append(s2).append(s3).toString();
Pero usted no recibe esta actuación beneficio porque estás usando StringBuffer explícitamente. Entonces, al ser inteligente, has causado un golpe de rendimiento cuando Java se volvió más inteligente que tú. Así que debes tener en cuenta que hay cosas por las que no pensarás.
Echa un vistazo a esta interesante lectura: http://www.precisejava.com/javaperf/j2se/StringAndStringBuffer.htm – Zaki
@Zaki: Esos puntos de referencia no son realmente tan útiles en términos prácticos. Lo que es más útil es perfilar su aplicación para ver si realmente tiene un cuello de botella de rendimiento. Y elegir los algoritmos apropiados y las estructuras de datos para su caso de uso particular. – mellamokb