제이온

[Effective Java] Item 5: Usa la inyección de dependencia en lugar de especificar recursos

Creado: 2024-04-28

Creado: 2024-04-28 13:39

Si una clase depende internamente de uno o más recursos y esos recursos afectan el comportamiento de la clase, entonces es mejor no usar clases singleton o clases de utilidad estáticas.


La clase no debe crear estos recursos directamente. En su lugar, es preferible pasar los recursos necesarios al constructor. La inyección de dependencias puede mejorar la flexibilidad, reutilización y facilidad de prueba de la clase.


Ejemplo

Ejemplo de uso de una clase de utilidad estática

Este ejemplo asume que la clase de utilidad solo usa un diccionario. Sin embargo, en la realidad, los diccionarios suelen estar separados por idioma e incluso se pueden tener diccionarios especiales para vocabulario específico.


Ejemplo de uso de una clase singleton


De la misma manera, una clase singleton también asume que solo usa un diccionario, por lo que se presenta la misma desventaja que en el caso anterior.


Solución 1 - Eliminar la palabra clave final del campo


También se puede diseñar para que el diccionario de una clase de utilidad estática o una clase singleton se pueda reemplazar con otro diccionario desde el exterior eliminando la palabra clave final. Sin embargo, este método es incómodo de usar y puede causar problemas de concurrencia en entornos multihilo.


Solución 2 - Usar la inyección de dependencia


A través de este ejemplo, pudimos ver que las clases estáticas y las clases singleton no deben depender de recursos internos. En otras palabras, es preferible que los recursos internos sean inyectados desde el exterior.


Las clases que usan la inyección de dependencia pueden garantizar la inmutabilidad gracias a la palabra clave final y tienen la ventaja de admitir varias instancias de recursos. Además, la inyección de dependencias se puede aplicar no solo en el constructor, sino también en métodos de fábrica estáticos y constructores.


La inyección de dependencias puede simplemente pasar el propio recurso, pero a menudo se usa un método para pasar un generador de recursos. Un generador es un objeto que crea una instancia de un tipo específico repetidamente cuando se llama. Este método se llama patrón de método de fábrica y Supplier<T> en Java 8 es un ejemplo perfecto de un generador.



Principalmente, se usa un tipo comodín limitado para restringir el parámetro de tipo del generador. Al usar este método, el cliente puede pasar cualquier cosa que sea un subtipo del tipo que especificó al generador.


La inyección de dependencias mejora la flexibilidad y la facilidad de prueba, pero puede ser bastante costosa en proyectos con muchas dependencias. En tales casos, se puede usar un marco de inyección de dependencias (como Dagger, Guice o Spring) para reducir el costo.


Fuente

Comentarios0