10

Las clases genéricas encapsulan operaciones que no son específicas de un tipo de datos concreto. El uso más común de las clases genéricas se da con las colecciones, como listas vinculadas, tablas hash, pilas, colas, árboles, etc., en las que las operaciones tales como agregar y quitar elementos de la colección se realizan de forma similar independientemente del tipo de datos que se almacena.

Normalmente, para crear clases genéricas se empieza a partir de una clase concreta existente y se cambian los tipos, uno a uno, por parámetros de tipo hasta que se obtiene un equilibrio óptimo entre generalización y utilidad. Al crear sus propias clases genéricas, se deben tener en cuenta las siguientes consideraciones importantes:

  • Tipos que se generalizan como parámetros de tipo.

Como regla general, cuantos más tipos se puedan parametrizar, más flexible y reutilizable será el código. Sin embargo, un exceso de generalización puede producir código difícil de leer y comprender para otros programadores.

Una buena regla consiste en aplicar las restricciones máximas posibles que sigan permitiendo controlar los tipos que es necesario controlar. Por ejemplo, si sabe que la clase genérica está exclusivamente destinada al uso con tipos de referencia, aplique una restricción de clase. Esto evitará el uso imprevisto de la clase con tipos de valor y permitirá utilizar el operador as en T y comprobar si hay valores nulos.

  • Factorizar o no el comportamiento genérico en las clases base y las subclases.

Dado que las clases genéricas pueden actuar como clases base, se aplican las mismas consideraciones de diseño que con las clases no genéricas.

  • Implementar o no una o varias interfaces genéricas.

La implementación de interfaces genéricas permite la ampliación de funcionalidades de cualquier clase base, el uso de interfaces nos permite simular un tipo de herencia múltiple dentro del lenguaje Java.