21 agosto, 2009
Consejos y trucos útiles para los programadores de este lenguaje particular.
Java es un lenguaje de programación orientado a objetos desarrollado por Sun. Se caracteriza por la gran comunidad que posee, probablemente, su punto más fuerte. ¿Cuál es la ventaja de tener una gran comunidad? Que cuando nos topemos con algún problema al desarrollar, probablemente alguien ya se haya encontrado con el mismo o con uno similar, y haya desarrollado y compartido con el resto de la comunidad alguna herramienta que nos haga la vida mucho más fácil al momento de hallar una solución a nuestro problema. Cuando se desarrolla en Java, es muy importante explorar un poco las publicaciones del resto de los miembros de la comunidad, porque quizás hayan desarrollado herramientas similares a las que necesitamos, y éstas ya estén depuradas y testeadas. Esta práctica es muy utilizada, dado que no querremos reinventar la rueda por cada proyecto que tengamos que emprender.
A ensuciarse las manos
Java se diferencia de muchos lenguajes OO porque libera al programador de lidiar con ciertos aspectos de bajo nivel –como el manejo de memoria–, de los cuales él mismo se hace cargo.
Es fuertemente tipado, lo que significa que, al momento de definir una variable, hay que definir también su tipo. Esto le da al lenguaje una ventaja: detecta muchos de los errores en tiempo de compilación y evita que el programa falle mientras está corriendo, ya que al momento de compilar, advierte si se le está mandando un mensaje a un objeto que no lo entiende.
Pero no todo es color de rosas. El hecho de que sea fuertemente tipado también trae una desventaja: limita mucho más el uso del polimorfismo; es decir, la existencia de métodos distintos, pero con el mismo nombre. Esta característica nos permite tratar objetos de distinto tipo de igual forma, sin importar su tipo. Sólo sabemos que entiende el mensaje que le vamos a enviar, y con eso nos alcanza. El objeto resolverá según el contenido de ese método. Veamos un ejemplo para ser más claros: supongamos que tenemos varios objetos que entienden el mismo mensaje, y queremos meterlos en una colección, recorrerla y enviar el mismo mensaje a cada uno.
Estos objetos deben ser todos del mismo tipo, ya que la colección es tipada. Si tenemos objetos del tipo Avión,
Barco y Tanque, y queremos decirles a todos que se muevan, necesitamos tres colecciones para recorrerlas y enviarles el mensaje Movete() a todos. ¿Cómo soluciona Java este problema? Con interfaces. Una interfaz es un tipo con los métodos declarados, pero vacíos de código. Lo que se hace en este caso es crear una interfaz llamada, por ejemplo, movible, y hacer que las tres clases anteriores la implementen. De esta manera, los objetos que antes eran de tipo Barco ahora serán de tipo Movible también. Hecho esto, podemos crear una colección de objetos de tipo Movible y tratar a todos los de las tres clases anteriores dentro de ella.
Si luego precisamos que los objetos de las clases Avión y Tanque puedan atacar, lo que hacemos es crear otra interfaz de nombre Atacante y hacer que las dos clases la implementen.
Si más adelante queremos agregar otra clase de tipo Submarino, y hacer que los objetos de ésta y de Barco puedan navegar, agregamos otra interfaz e indicamos a ambas clases que las implementen.
La jerarquía de clases terminada se aprecia mejor en la figura de la página 42. Si bien la relación de las clases con la interfaz/es de las que heredan es muy fuerte, no lo es tanto como una superclase. En este caso se dice que un objeto de la clase Barco es un Barco, y entiende los mensajes de Movible y Navegante. De esta forma, con las interfaces podemos explotar el polimorfismo más allá de los límites que nos presenta el compilador, y trabajar de manera uniforme con objetos que se encuentran desparramados en la jerarquía de clases. Un poco de código al respecto se ve a continuación:
Extracto de nota publicada en Power Users 70, por José Ignacio Vidal.
Además, en la nota:
Interfaz list, Interfaz set, objetos obsoletos, comentarios, definiendo anotaciones propias, y mucho más.