Conviértete en un experto programador de Java con «Effective Java, 2nd Edition»

0
4311

No es un libro reciente sobre Java (es de 2008), ni trata sobre los últimos avances de Java (hasta 1.6), pero es uno de los más importantes si quieres saber programar Java “de verdad”. Estoy hablando de “Effective Java, Second Edition” de Joshua Bloch.

Es complicado transmitir la temática de este libro frente a los típicos manuales técnicos de Java… voy a intentarlo con una metáfora.

Es posible que tengas un carné para conducir coches y que lo sacases a la primera sin ningún fallo. Es posible que uses tu vehículo a diario y tengas cientos de miles de kilómetros a tus espaldas, y que te consideres un buen conductor con cierta pericia al volante, pero… ¿serías capaz de subirte a un potente coche de competición en un circuito mojado hacer un buen tiempo? Probablemente no supieses cómo reaccionar en la primera curva y salieses recto (yo también). Quizá, si recibes un curso de conducción de Fernando Alonso o Carlos Sainz, posiblemente pensarás que realmente no tienes ni idea de conducción, que te queda mucho que aprender, y que puede que hayas cometido imprudencias de las que no eras consciente hasta ese momento.

Si cambias “conducir un coche” por “programar en Java”, y si cambias “conducir un potente coche de competición sobre pista mojada” por “programar aplicaciones de forma realmente correcta y profesional” podrás deducir que el libro que te voy a contar es el “curso de conducción de Fernando Alonso”, que realmente se trata de “Effective Java, Second Edition” de Joshua Bloch.

En este libro, Joshua Bloch, experto programador (Ph.D. por Carnegie Mellon, y antiguo miembro de Sun Microsystems en el equipo de creación del lenguaje Java) enseña cómo trabajar con las herramientas que pone a nuestra disposición Java de un modo adecuado o mejor dicho efectivo.

Al contrario que la mayoría de los manuales de programación en Java, como pueda ser el conocido Thinking in Java, este libro no es un catálogo de funcionalidades: sintáxis y API que podemos usar. Se trata más bien una reflexión sobre cómo usar las funcionalidades para programar adecuadamente, meditando sobre las implicaciones que tiene ciertas prácticas, razonando los porqués y mostrando todo tipo de alternativas e indicando cuáles se deberían seguir.

Seguro que conoces la sintáxis de las excepciones y las usas habitualmente, pero ¿tienes claros los criterios de cuándo hay que usarlas? ¿Sabías que la forma más óptima de hacer un Singleton es usando enums? ¿Para tí serializar es simplemente poner “implements Serializable”? ¿Reflexionas sobre qué debe ser público y qué privado? ¿Te has parado a pensar si tus objetos son mutables? Estas son una pequeña muestra de las múltiples preguntas que te harás, y el autor responderá, si lees este libro.

Joshua Bloch estructura la obra en 78 tópicos o “items” independientes, que se agrupan en 10 temáticas. Voy a intentar citar algunos de los que me han parecido más relevantes por temática para que veas de qué trata el libro:

1. Creación y destrucción de Objetos

Trata conceptos como las limitaciones del uso de constructores y el uso del patrón Builder o factorías como sustitutos; cómo hacer singletons con los enums; las clases de utilidades no instanciables o la reutilización de objetos.

2. Métodos comunes a todos los objetos

Reflexiona sobre la importancia de sobreescribir los métodos equals y hashcode, la importancia del toString y Comparable y las implicaciones, mucho más dramáticas de lo que pudiéramos pensar si no lo hacemos correctamente.

3. Clases e Interfaces

Expone por qué se debe ser muy cuidadoso a la hora de definir el nivel de acceso a los elementos de una clase; la importancia de un concepto al que no se le suele dar mucha importancia pero que es vital, como es la mutabilidad; las limitaciones de la herencia y por qué se debe favorecer la composición; el patrón strategy o el uso correcto de las clases internas estáticas.

4. Genéricos

Este tema es especialmente brillante, tratando conceptos como el type erasure o la invariancia, las listas frente a los arrays de objetos; el uso de genéricos y la importancia de detectar errores de tipado en tiempos de compilación; o emplear wildcards para hacer más flexibles nuestras clases.

5. Enums y Anotaciones

Aquí descubre usos muy útiles de los enums y cómo adaptarlos a numerosas situaciones, aprovechando su utilidad en el tipado en tiempo de compilación, o cómo hacerlos extensibles. También trata el tema de anotaciones, razonando sobre su utilidad real y su justificación, dando casos de uso y consejos que seguramente no te hayas planteado nunca.

6. Métodos

Es un compendio de buenas prácticas a la hora de tratar con métodos: desde la comprobación inicial de parámetros antes de hacer la lógica real, hasta el concepto de copia defensiva para eliminar la mutabilidad externa de los objetos; también trata de la sobrecarga de métodos en Java y sus problemas; o el número variable de argumentos; y un curioso detalle: el porqué devolver listas vacías en vez de null.

7. Programación en General

Hace un repaso sobre aspectos generales de programación. Muchos son comunes, como el uso de las variables, pero lo explica de forma muy elegante. Otros tópicos importantes: el uso de librerías conocidas (no reinventar la rueda); los problemas de float y double si queremos exactitud como un int; la inmutabilidad de los String; el uso de interfaces y no de implementaciones; métodos nativos o temas de optimización entre otros.

8. Excepciones

Nos explica cómo se deben usar las excepciones. Los diferentes tipos que hay (runtime, checked…) y cuando usar cada uno. Habla de buenas prácticas de su uso y prové de multitud de ejemplos. La documentación de las excepciones en nuestras API también es otro tópico que me ha gustado mucho, siempre desde unos razonamientos lógicos indiscutibles.

9. Concurrencia

Aunque es un tema muy extenso, sí que da un repaso a los puntos más importantes, y lo que es más importante: advierte con ejemplos de muchos problemas de los que ni siquiera te habías planteado que se pudieran dar. Habla sobre la sincronizaciòn, tanto por defecto como por exceso, y de cómo se trata en con las API de Java a partir de la 1.5 y de por qué no se debe hacer con los métodos primitivos. También prové referencias de otros libros para profundizar en el tema.

10. Serialización

Finalmente el tema de la serialización, más importante de lo que creemos. Incide en aspectos como la reflexión sobre si estamos realizando correctamente la serialización por defecto o debemos revisarla. También muestra ejemplos que nos harán tener más cuidado la próxima vez que dejemos la serialización en manos de la JVM por defecto, ya que nos estamos exponiendo a problemas potenciales.

Como habrás podido comprobar se trata de un índice un poco heterogéneo porque no se trata de un análisis monótono de capacidades, sino de la síntesis de su experiencia, y esto no tiene por qué corresponder con una estructura clásica de un libro de sintáxis del lenguaje.

No se trata de una simple exposición de tópicos: el autor propone contraejemplos, casos de uso, soluciones y refactorizaciones para que el lector pueda entender las implicaciones que tiene hacer las cosas de un modo efectivo o hacerlas de otro modo.

Si lo lees con detenimiento (y aconsejo varias lecturas), podrás extraer una filosofía de programación que transmite a lo largo de todo el texto. Cada decisión de diseño, cada advertencia que hace, cada análisis del problema, está condicionado por los principios de un buen diseño mantenible (nombres de variables y métodos adecuados, uso de patrones de diseño, captura de errores en compilación y no runtime, etcétera).

También resultan curiosas las críticas que va salteando el autor a lo largo del texto a algunas implementaciones propias del lenguaje Java, sobre todo en algunas de las API que no fueron todo lo bien diseñadas que cabría esperar. El dominio del lenguaje Java (de hecho ha colaborado en el desarrollo de partes del lenguaje), patrones de diseño y de la implementación interna por parte del autor es excepcional.

En definitiva, se trata de una lectura obligada para todos aquellos que tengan experiencia programando en Java (y especialmente crean que son buenos programadores): es difícil encontrar tantos buenos consejos y tanta sabiduría sobre cómo programar en un sólo libro. Vale su peso en oro

Ah, antes de terminar una última advertencia: léelo con tranquilidad, reflexionando sobre cada lectura, como si fuera un libro de filosofía, y no te frustres 🙂 . Y cuando hayas acabado, planifica una segunda lectura, merece la pena.

Puedes comprarlo en Amazon.es pinchando en la portada:


Effective Java: A Programming Language Guide (Java Series)

Dejar respuesta

Please enter your comment!
Please enter your name here