Como crear clases para utilidades
A veces tenemos métodos que no encajan en un objeto, es decir que no vamos a instanciar y mantener dicha instancía a lo largo de la ejecución del programa. Simplemente lo usaremos para llamar algún método. En esos casos crearemos una clase de utilidad.
En Java por ejemplo tenemos java.lang.Math con utilidades matemáticas. Estas clases no deben poder instanciarse, ni tampoco deben poder heredarse.
En principio es algo que podemos solucionar simplemente lanzando una excepción en el constructor y colocando el modificador de acceso private en el constructor.
private UtilityClass() {
throw new AssertionError("Constructor not allowed");
}
Otras clases no pueden heredar porque necesitan un constructor accesible. Y no podemos instanciar tampoco con reflection porque nos dará una excepción.
También podemos hacer la clase final esto sirve para que otras clases no puedan heredar, aunque con el constructor privado ya tenemos suficiente.
Finalmente quiero comentar que esto también se puede conseguir con Lombok, utilizando la anotación @UtilityClass. Si observamos el código generado veremos que hace ambas cosas (clase final y constructor privado con excepción).
public final class UtilityClass {
@Generated
private UtilityClass() {
throw new UnsupportedOperationException(
"This is a utility class and cannot be instantiated"
);
}
}
Referencias
Joshua Bloch, Effective Java (3ª edición), Addison-Wesley, 2018.
https://projectlombok.org/
Top comments (0)