DEV Community

Elías Canales
Elías Canales

Posted on

Herencia vs clases etiquetadas

No suele ser muy habitual, pero a veces se crean clases que se basan en un enumerador para tomar decisiones en sus distintos métodos. Esto puede ser señal de clases etiquetadas.

Clases etiquetadas

Las clases etiquetadas ocurren cuando hacemos en una clase la distinción de un tipo mediante un atributo. No confundir con el estado de una clase, aunque incluso ese enfoque también podría mejorarse con clases, pero eso es una historia diferente.

Por ejemplo, si tenemos una clase que puede estar ejecutada, no ejecutada o en error, y obviamente sus métodos pueden actuar de distinta forma según el estado, esto sería parte del estado de la clase.

Sin embargo, si tenemos una clase usuario y que dentro tipo un atributo rol con los valores administrador, empleado y comprador. Es probable que estemos ante un caso de clases etiquetadas, más aún cuando no todos los atributos le pertenecen a todos los tipos de usuario.

Muy probablemente, en función de este tipo, tendremos un comportamiento distinto en los métodos o incluso en el constructor switch.

Herencia

La herencia consiste en otorgar más funcionalidad a una clase, al heredar de una clase superior. La clase hija hereda la funcionalidad de la clase padre y modifica o implementa su propia funcionalidad.

Tomando el ejemplo anterior, supongamos que no hay usuarios que no sean administrador, empleado o comprador. En ese caso, podríamos tener una clase usuario de tipo abstracta y 3 clases que heredan de usuario.

Una jerarquía de clases donde los métodos específicos están implementados en cada una de las clases, donde fuera de esto podemos hacer distinción por el tipo de la clase e incluso podemos usar sobrecarga de métodos con los tipos en otros servicios.

Conclusión

No caigas en la trampa de crear clases etiquetadas, aunque la herencia puede traer problemas, en los casos en los cuales encaja perfectamente como una de jerarquía de clases, la herencia es la mejor solución con diferencia.
Permitirá que tu clase sea más fácil de mantener y con un código más limpio.

Referencias
Joshua Bloch, Effective Java (3ª edición), Addison-Wesley, 2018.

Top comments (0)