Mostrando entradas con la etiqueta String. Mostrar todas las entradas
Mostrando entradas con la etiqueta String. Mostrar todas las entradas

martes, 21 de mayo de 2013

Java buenas prácticas concatenación de Strings



Se ha demostrado a lo largo de la vida de Java, que el operador +, para la concatenación de objetos String, es ineficiente, ya que al utilizarse sobre variables, el compilador genera nuevas instancias (reserva memoria para ello) del objeto, para realizar la concatenación.

Por eso es aconsejable evitar la concatenación de objetos String mediante el operador +.
Por lo que es una mala práctica hacer lo siguiente: String s = s1 + s2 + “texto” + s3

Aunque no tiene efecto al hacer lo siguiente: String s = “Esto” + “es” + “una prueba”, ya que en este caso como las String a usar son constantes, no se realiza la reserva de la memoria, sino que el compilador lo agrupa todo en una única String.



Para realizar la concatenación citada en el primer caso, se deberá hacer lo siguiente:

StringBuffer strbuf = new StringBuffer();
strbuf.append(s1);
strbuf.append(s2);
String s = strbuf.toString();

 

viernes, 17 de mayo de 2013

Java buenas prácticas Instanciar objetos al mínimo.



Una de las operaciones que más coste tienen a la hora de consumir memoria en los desarrollos Java, son las instanciaciones de objetos, estas deben realizarse solo en los casos que sea necesario, evitando de esta manera consumir memoria que no es necesaria. Para ello, existen técnicas que evitan la instanciación de objetos que no sean necesarios.


Vamos a ver ejemplos para los casos de objetos de tipo String, Boolean o Integer. Aunque los casos que más memoria consumen son los objetos personalizados, que estarán formados por más de un atributo de estos tipos, o listas y mapas de variables, pero de esta forma, podemos evitar algunos de esos casos  si lo extrapolamos a nuestros objetos.

Deben evitarse instanciaciones de objetos de tipo String como la siguiente: String a = new String(“Hola”), para lo que podemos usar String a = “Hola” evitando la llamada a new, que consume espacio en memoria, o también String.valueOf(“Hola”).

Para las Boolean, además de la factoría estática (Boolean.valueOf(true)), tenemos la posibilidad, de indicar el valor de la siguiente manera Boolean b = Boolean.TRUE, que tampoco realizaría una instanciación de Boolean.

Citando a los propios creadores de la clase Boolean:

“It is rarely appropriate to use this constructor. Unless a new instance is required, the static factory valueOf(boolean) is generally a better choice. It is likely to yield significantly better space and time performance.”

Solo hay un caso en el que crear una instancia nueva de un Boolean, tiene sentido, y es cuando se quiera hacer una comparación por referencia y no por el valor.

Para los objetos de tipo Integer, tenemos disponible al misma factoría estática, que podemos usar, Integer.valueOf(1), que nos evita la llamada al new de Integer.