Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Esta es una publicación traducida por IA.

제이온

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

Seleccionar idioma

  • Español
  • English
  • 汉语
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

Texto resumido por la IA durumis

  • Si una clase depende internamente de uno o más recursos, es mejor no usar clases de utilidad estáticas ni singletons, y es preferible usar la inyección de dependencia.
  • El uso de la inyección de dependencia puede mejorar la flexibilidad, la reutilización y la facilidad de prueba de la clase, y los recursos pueden inyectarse en el constructor, la fábrica estática, el constructor, etc.
  • La inyección de dependencia se puede usar pasando el propio recurso o una fábrica de recursos, y en proyectos con muchas dependencias, es eficiente usar un marco de inyección de dependencia.

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


La clase tampoco debe crear estos recursos directamente, sino que es mejor pasar los recursos necesarios al constructor. A través de la inyección de dependencia, se puede mejorar la flexibilidad, la reutilización y la facilidad de prueba de la clase.


Ejemplo

Ejemplo de uso de la clase de utilidad estática

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Lógica que usa dictionary
    }

    public static List suggestions(String typo) {
        // Lógica que usa dictionary
    }

Se supone que esta clase de utilidad usa solo un diccionario. Sin embargo, en la realidad, los diccionarios están separados por idioma, e incluso hay diccionarios especiales para vocabulario especializado.


Ejemplo de uso de una clase singleton

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Lógica que usa dictionary
    }

    public static List suggestions(String typo) {
        // Lógica que usa dictionary
    }


De manera similar, la clase singleton también asume que usa solo un diccionario, por lo que ocurre la misma desventaja que antes.


Solución 1: Eliminar la palabra clave final del campo.

public class SpellChecker {

    private Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static void changeDictionary(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // Lógica que usa dictionary
    }

    public static List suggestions(String typo) {
        // Lógica que usa dictionary
    }


También puedes eliminar la palabra clave final del diccionario de la clase de utilidad estática o la clase singleton, y diseñar la clase para que se pueda reemplazar el diccionario con otro diccionario externo. Sin embargo, este método es difícil de usar en sí mismo, y puede causar problemas de simultaneidad en entornos multihilo.


Solución 2: Usar la inyección de dependencia.

public class SpellChecker {

    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // Lógica que usa dictionary
    }

    public static List suggestions(String typo) {
        // Lógica que usa dictionary
    }


A través del ejemplo anterior, podemos sentir que las clases estáticas y las clases singleton no deberían depender de recursos internos. Es decir, es mejor que los recursos internos se inyecten desde el exterior.


La clase que utiliza la inyección de dependencia tiene la ventaja de garantizar la inmutabilidad gracias a la palabra clave final, y admite múltiples instancias de recursos. Además, la inyección de dependencia se puede aplicar no solo en el constructor, sino también en fábricas estáticas y constructores.


La inyección de dependencia no solo se puede hacer pasando los recursos en sí, sino que también se usa a menudo pasando una fábrica de recursos. Una fábrica es un objeto que crea repetidamente instancias de un tipo específico cada vez que se llama. Este método se llama patrón de método de fábrica, y Supplier en Java 8 es un ejemplo perfecto de la expresión de una fábrica.


public static List create(Supplier generator) {
    ...


Principalmente, se utiliza un tipo de comodín limitado para restringir el parámetro de tipo de la fábrica. Al usar este método, el cliente puede pasar cualquier fábrica que sea un subtipo del tipo especificado.


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


Fuente

제이온
제이온
제이온
제이온
[Effective Java] Artículo 3. Garantiza un singleton con un constructor privado o un tipo de enumeración Presenta tres métodos para implementar el patrón singleton en Java (miembro público static, método de fábrica estático, tipo de enumeración) y explica las ventajas y desventajas de cada método, así como las precauciones que se deben tomar durante la seria

27 de abril de 2024

[Effective Java] Item 4. Use a private constructor to prevent instantiation Las clases de utilidad que contienen solo métodos y campos estáticos deben configurar el modificador de acceso de su constructor como privado para evitar la creación de instancias. Esto evita que los usuarios asuman que el constructor es generado automáti

28 de abril de 2024

[Effective Java] Item 6. Evita la creación innecesaria de objetos Esta es una guía sobre cómo reducir la creación innecesaria de objetos en Java. Para objetos inmutables como String y Boolean, es mejor usar literales y para expresiones regulares, es mejor almacenar en caché las instancias de Pattern. Además, el autoboxi

28 de abril de 2024

Modelado de datos físico El modelado de datos físico es el proceso de diseñar las tablas de una base de datos relacional para que sean realmente utilizables. Se busca optimizar el rendimiento mediante la eficiencia del espacio de almacenamiento, el particionamiento de datos, el d
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 de abril de 2024

[python] Fundamentos de Python 1: Introducción a los Módulos de Python En este artículo, se describe la migración de un programa desarrollado en PHP a Python, incluyendo los conceptos básicos de Python y el uso de módulos. Python es un lenguaje de script que admite el tipeo dinámico y es independiente de la plataforma. Ofrec
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

27 de marzo de 2024

Modelado de datos lógico El modelado de datos lógico es el proceso de convertir el modelado de datos conceptual en el paradigma de la base de datos relacional de acuerdo con las reglas de mapeo, manejando las relaciones 1:1, 1:N y N:M y asegurando la integridad de los datos media
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 de abril de 2024

Guía de introducción a Rust Guía de introducción a Rust para principiantes: desde la instalación del compilador hasta la comprensión de los conceptos básicos. Cubre cómo utilizar las últimas tecnologías y bibliotecas a través de la documentación oficial y los cursos. Explica paso a
곽경직
곽경직
곽경직
곽경직
곽경직

30 de marzo de 2024

[No técnico, sobrevivir como desarrollador] 9. Sitios web adecuados para crear un portafolio Se presentan tres tipos de sitios web que son adecuados para que los estudiantes de becas o bootcamps los creen como portafolios de empleo. Puedes desarrollar groupware, ERP, sistemas internos de recursos humanos, etc. que se utilizan comúnmente en las em
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

30 de marzo de 2024

[Sin título, sobreviviendo como desarrollador] 7. Lo que sí y lo que no ayuda al conseguir empleo en la industria Al preparar la búsqueda de empleo como desarrollador, un blog de tecnología no es muy eficiente, pero GitHub es recomendable para la gestión de proyectos y el intercambio de código fuente. Entre los diversos certificados, es mejor preparar el certificado
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

29 de marzo de 2024