Cast es el proceso de convertir o moldear un tipo de dato a otro, es un recurso infinitamente utilizado por los programadores y que tiene un costo asociado si se realiza en tiempo de ejecución.
Los compiladores pueden resolver muchas de las conversiones en tiempo de compilación haciendo que ese costo se disminuya a nada. Obviamente hay compiladores mas inteligentes que otros, por lo que no debe sorprendernos encontrar que existan compiladores que manejen mejor el tema de las conversiones que otros.
Si bien el costo asociado a una operación de conversión puede llegar a ser pequeño comparado a los costos generados por problemas de performance mayor, como puede ser un mal manejo de un caché, no quiere decir que, este recurso mal utilizado pueda provocar un bajo rendimiento, o planteado desde otro punto de vista, no quiere decir que teniendo en cuenta algunas cosas, no podamos lograr un impacto significativamente positivo en nuestras aplicaciones.
No es difícil encontrar un escenario en donde esto pueda ocurrir imaginemos este pequeño costo multiplicado por cientos o miles de usuarios concurrentes, en esta situación evitar un abuso de 'casteos' hubiera implicado una mejor performance.
Consideremos dos tablas con miles de filas y unas cuantas columnas y dos modelos de tablas distintos. En uno de los modelos en el método getValueAt(int,int) escrito haciendo mal uso de la conversión y en el otro modelo evitando la conversión. Prueben el desempeño de ambas tablas, las diferencias son evidentes.
La conversión de datos primitivos es más rápida que la conversión de objetos ya no deben efectuarse una serie de pruebas que a los objetos si se le aplican, es una mera conversión de tipos pero que tiene la desventaja de solo puede ser resuelva en tiempo de ejecución.
El costo de una operación de una conversión objetos depende de la profundidad de la herencia cuanto mas alejada están las clases que queremos convertir mas caro es. Las interfaces tienen un costo asociado mayor que las clases comunes.
Debemos evitar siempre que se pueda la conversión, utilizando los tipos de datos y clases correctos.
A continuación un pequeño ejemplo.
public void enviarMensajes(ArrayList mensajes, Object objeto){
if(objeto instanceof Persona){
Iterator itMensajes = mensajes.iterator();
for(int n = 0; itMensajes.hasNext(); n++){
Mensajes mensaje = (Mensaje)mensajes.next();
mensaje.setDestinatario((Persona)objeto);
mensaje.setNumero(n);
}
}
}
Si una variable debe ser casteada muchas veces, es recomendable utilizar una variable temporal para evitar el abuso. Noten como ahorro castear el Object a Persona una cantidad indeterminada de veces.
public void enviarMensajes(ArrayList mensajes, Object objeto){
if(objeto instanceof Persona){
Iterator itMensajes = mensajes.iterator();
Persona persona = (Persona)objeto;
for(int n = 0; itMensajes.hasNext(); n++){
Mensajes mensaje = (Mensaje)mensajes.next();
mensaje.setDestinatario(persona);
mensaje.setNumero(n);
}
}
}
Utilizar las herramientas del lenguaje, Java 1.5 es genial para esto, noten de que manera prácticamente no existe necesidad de efectuar una conversión.
public void enviarMensajes(ArrayList < Mensaje > mensajes, Object objeto){
if(objeto instanceof Persona){
Persona persona = (Persona)objeto;
for(int n = 0; n < mensajes.size(); n++){
Mensajes mensaje = mensajes.get(n).next();
mensaje.setDestinatario(persona);
mensaje.setNumero(n);
}
}
}
Usuarios que han visto este tema también han visto...
- Escribir en un archivo o consola con Java
- Leer y escribir en un Socket en Java
- Creación de nuestro propio servidor web
- Conexiones Base de Datos en Java
- Creación de una Clase utilizando otra ya creada

Información legal | Política de Privacidad | Contacte con nosotros
Otro proyecto de Factoría de Internet. Copyright© 2003-2008 Factoría de Internet S.L.. Todos los derechos reservados.