Encuesta

¿Qué sistema operativo empleas principalmente cuando desarrollas Java?

28-02-2010 - 947 votos

Destacados Agenda

Más eventos |

¿Problemas con Generics ó de Generics? (Opinión publicada en Sólo Programadores)

26/09/2008 11:02 abraham

¿Problemas con Generics ó de Generics?

Luis Enrique Funes, lefunes.wordpress.com 

 

Desde la vista de usuario son grandes las ventajas de consumir una librería desarrollada sobre Generics a una que no lo hace, entre las que se encuentra una mayor limpieza en el código (lo que lleva a una mejora sustancial a la hora de comprender el mismo) y la posibilidad de trasladar errores de tipo en tiempo de ejecución (ClassCastException) a tiempo de compilación. Collection lo demuestra, por ejemplo al poder utilizar un Map adaptado a nuestras necesidades con solo indicar los tipos de la llave y del contenido.

 

 

Los problemas aparecen para muchos desarrolladores al pararse enfrente, al implementar librerías mediante Generics, llegando varios a pensar que la razón por la cual no consiguen materializar sus soluciones es porque realmente hay algo extraño detrás de la implementación misma de Generics dentro de la JVM. Sin embargo, se pueden observar dos factores en común en casi todos los problemas:

 

  • Se busca en Generics algo para lo cual no fue diseñado
  • Falta de un análisis inicial de como Generics dará un valor agregado al usuario final

 

Generics simplemente pretende (además de proveer las ventajas para el usuario ya comentadas) permitirle al desarrollador abstraer de tipos su API, de forma que sea el usuario quien decida los que más le convengan.

  

La utilización lleva aparejado un estudio de las ventajas que realmente traerá al usuario y de ser este positivo, no hay duda que el tiempo a utilizar para la adaptación del API será tiempo realmente bien invertido.

Volver a actualidad

Etiquetas: otro, soloprogramadores, opinion

Comentarios: 8

  • Anónimo 26/09/2008 19:14

    Pregunta, esto funciona en Generics

     

    Miclase { .....

    Typo2 extends Typo1 { ....

     

    someMethod () {

    return new Miclase (); 

     

    Deberia funcionar o es una manera inadecuada de utilizar los generics? 

  • Marioko 26/09/2008 22:54

    Si, eso funciona, se escribira asi:

    class MiClase < T extends Persona > {

       doSomething(T){}

    }

     

  • fernandooa_ 28/09/2008 17:01

    Coincido totalmente con la opinión. El problema no son los generics, sino los problemas que uno se encuentra al querer crear una librería con ellos.

    Generics debería facilitar el uso de los APIs, no complicarlo. Siempre se pueden utilizar partes de generics para realizar apis que más cómodas de utilizar, como la posibilidad de realizar "autocast".

    //Esto es tan sólo un ejemplo, no pretende ser ningún API existente, sólo que "suene" 
    public ContextImpl implements Context {
    [...]
    public T getAttribute(String name) {
    return (T)attributes.get(name);
    }
    [...]
    }

    De tal modo que podamos hacer:

    public void ejecutar(Context ctx) {
    Integer iteraciones = ctx.getAttribute("iteraciones"); //Se hace "autocast" a Integer
    Callback metodo = ctx.getAttribute("metodo"); //"Autocast" a Callback
    [...]
    }

    Esta es posíblemente la característica más simple de "implementar" de los generics y consigue que desarrollar con ciertas librerías sea bastante más cómodo.

    El problema aparece cuando se intenta ir más allá de las posibilidades propias o de generics. Lo que generalmente termina en un uso incorrecto y un API engorroso, ya he tenido que hacer más de una "parada de carro" y rehacer algunas APIs por conseguir precisamente el resultado opuesto al deseado, complicar las cosas.

    Saludos.

  • fernandooa_ 28/09/2008 17:02

    ¡Vaya hombre!  El formateador ha vuelto a hacer de las suyas, donde pone:

    public  T getAttribute(String name) {
    Debería aparecer:
    public  <T> T getAttribute(String name) { 

  • greeneyed 29/09/2008 08:11

    ¿Ese ejemplo que has puesto funciona? No veo donde le dices que T puede ser Integer o Callback... o cualquier otra cosa. De todas formas, en este caso, si solo es para no tener que escribir un cast, no le veo la ganancia.

  • fernandooa_ 29/09/2008 10:48

    Funcionar funciona. Los métodos con esa "signature" hacen cast al tipo de dato en el que se intenta asignar el valor devuelto por el método.

    Lo de la ganancia, como dije, es muy pequeña, sólo "ahorras" el cast, no detectaría errores en tiempo de compilación, pero bueno, sólo era un ejemplo de cómo hacer que un API sea más cómodo de utilizar con un pequeñísimo toque de generics.

    Saludos.

    P.D.: Por cierto, parece que el mecanismo que utilizo en el ejemplo es más bien poco conocido. La verdad es que no lo he encontrado en ningún documento, lo encontré en algunas clases del API del JDK.

  • greeneyed 29/09/2008 11:15

    Curioso, curioso. Gracias por la información. Sabiendolo, aun me parece más cochinada :P, pero es bueno conocerlo por si te lo encuentras por ahí. Anular los chequeos de compilación para no tener que escribir un cast... para eso es mejor usar un lenguaje estilo Groovy y dejarse de guarradas.

  • fernandooa_ 29/09/2008 11:56

    ¡Jajaja! Pues debo de ser el cochino más cochino del corral, porque no le veo nada malo :P.

Escribe tu comentario

Sun Microsystem Logo NHT-Norwick Logo

© 2002-2007 Asociación javaHispano