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 é uma postagem traduzida por IA.

제이온

[Effective Java] Item 5: Use dependency injection instead of explicitly specifying resources

  • Idioma de escrita: Coreana
  • País de referência: Todos os países country-flag

Selecionar idioma

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

Texto resumido pela IA durumis

  • Se uma classe depender internamente de um ou mais recursos, é melhor não usar classes de utilitário estáticas e classes singleton, e é preferível usar a injeção de dependência.
  • O uso da injeção de dependência pode melhorar a flexibilidade, reusabilidade e facilidade de teste da classe, e os recursos podem ser injetados por meio do construtor, fábrica estática, construtor, etc.
  • A injeção de dependência pode ser usada passando o próprio recurso ou uma fábrica de recursos, e o uso de um framework de injeção de dependência é eficiente para projetos com muitas dependências.

Se uma classe internamente depender de um ou mais recursos e esses recursos influenciarem o comportamento da classe, é recomendável não usar singletons e classes de utilitários estáticas.


Esses recursos não devem ser criados diretamente pela classe, mas sim passados para o construtor quando necessários. A injeção de dependências pode melhorar a flexibilidade, reutilizabilidade e facilidade de teste da classe.


Exemplo

Exemplo de uso de classe de utilitários estáticos

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Lógica usando o dicionário
    }

    public static List suggestions(String typo) {
        // Lógica usando o dicionário
    }

Supõe-se que essa classe de utilitários usa apenas um dicionário. No entanto, na realidade, os dicionários podem ser separados por idioma e até mesmo dicionários separados podem ser usados para vocabulário especial.


Exemplo de uso de classe 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 usando o dicionário
    }

    public static List suggestions(String typo) {
        // Lógica usando o dicionário
    }


As classes singleton também assumem que usam apenas um dicionário, portanto, têm as mesmas desvantagens.


Solução 1 - Remova a palavra-chave final do 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 usando o dicionário
    }

    public static List suggestions(String typo) {
        // Lógica usando o dicionário
    }


Você também pode remover a palavra-chave final do dicionário em classes de utilitários estáticas ou classes singleton e projetar o código para que o dicionário possa ser substituído por outro dicionário externo. No entanto, esse método é complicado de usar e pode causar problemas de simultaneidade em ambientes multithread.


Solução 2 - Use injeção de dependência

public class SpellChecker {

    private final Lexicon dictionary;

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

    public static boolean isValid(String word) {
        // Lógica usando o dicionário
    }

    public static List suggestions(String typo) {
        // Lógica usando o dicionário
    }


Através deste exemplo, podemos perceber que as classes estáticas e singleton não devem depender de recursos internos. Ou seja, é recomendável injetar os recursos externos.


As classes que usam injeção de dependência têm a vantagem de garantir a imutabilidade graças à palavra-chave final, e também suportam várias instâncias de recursos. Além disso, a injeção de dependência pode ser aplicada não apenas no construtor, mas também em fábricas estáticas e construtores.


A injeção de dependência pode simplesmente passar o próprio recurso ou passar uma fábrica de recursos, que é frequentemente usada. Uma fábrica é um objeto que cria repetidamente uma instância de um determinado tipo quando chamada. Esse método é chamado de padrão de método de fábrica, e o Supplier no Java 8 é um exemplo perfeito de uma fábrica.


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


Geralmente, o tipo de parâmetro de uma fábrica é restrito usando um tipo de curinga limitado. Com esse método, o cliente pode passar qualquer fábrica que seja um subtipo do tipo especificado.


A injeção de dependência melhora a flexibilidade e a facilidade de teste, mas pode ser bastante cara em projetos com muitas dependências. Nesse caso, você pode usar uma estrutura de injeção de dependência (Dagger, Guice, Spring etc.) para reduzir os custos.


Fonte

제이온
제이온
제이온
제이온
[Effective Java] Item 3. Garanta o Singleton com um construtor privado ou um tipo de enumeração Este artigo apresenta três métodos para implementar o padrão Singleton em Java (membro estático público, método de fábrica estático e tipo de enumeração), e discute os prós e contras de cada método, bem como as precauções a serem tomadas ao serializar. El

27 de abril de 2024

[Effective Java] Item 1: Considere métodos de fábrica estáticos em vez de construtores Os métodos de fábrica estáticos são uma maneira flexível e eficiente de criar instâncias em vez de construtores. Eles podem ter um nome, retornar instâncias que atendem a condições específicas e melhorar o desempenho por meio do cache. Ao contrário do pad

27 de abril de 2024

[Effective Java] Item 4. Use a private constructor to prevent instantiation As for utility classes that contain only static methods and fields, it is good practice to set the access modifier of the constructor to private to prevent instantiation. This prevents users from mistaking the constructor for a automatically generated one

28 de abril de 2024

Simulando o Prisma Client para testes unitários no NestJS Ao realizar testes unitários em uma aplicação, a remoção de dependências externas é crucial. Com o método de simulação do Jest para o Prisma ORM, você pode realizar testes unitários de forma simples. Após instalar o pacote jest-mock-extended, você pode si
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2 de abril de 2024

Como a Rust previne bugs de simultaneidade Rust é uma linguagem poderosa que resolve os desafios da programação concorrente. Seu sistema de tipos e modelo de propriedade garantem a transferência e o compartilhamento de dados seguros entre threads. Padrões de mutabilidade interna, como Mutex, Chann
곽경직
곽경직
곽경직
곽경직
곽경직

28 de março de 2024

[Não-técnico, sobrevivendo como desenvolvedor] 7. O que ajuda e o que não ajuda na busca por um novo emprego Ao se preparar para uma vaga de desenvolvedor, um blog de tecnologia é ineficaz, mas o GitHub é recomendado para gerenciar projetos e compartilhar código-fonte. Entre as várias certificações, é recomendável preparar a certificação de processamento de dado
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

29 de março de 2024

Modelagem de dados conceitual A modelagem de dados conceitual é o processo de separar entidades, representar suas relações em um ERD. Uma entidade é uma unidade de informação independente, e um atributo é o dado que uma entidade possui. Um identificador identifica exclusivamente uma e
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 de abril de 2024

[Não graduado, sobrevivendo como desenvolvedor] 14. Resumo do conteúdo da entrevista técnica frequente para desenvolvedores juniores Guia de preparação para entrevista técnica para desenvolvedores juniores. Área de memória principal, estrutura de dados, RDBMS e NoSQL, orientação de procedimentos e orientação de objetos, sobreposição e sobrecarga, algoritmo de substituição de página, pr
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 de abril de 2024

Empresas que lideram a resolução da escassez de mão de obra na indústria japonesa com tecnologia inovadora A Daihatsu, do Japão, desenvolveu um "sistema de fornecimento de energia sem contato" que resolve a geração de poeira por atrito e a prevenção de faíscas, contribuindo para a resolução da escassez de mão de obra. Tornou-se uma tecnologia essencial em fábr
durumis AI News Japan
durumis AI News Japan
durumis AI News Japan
durumis AI News Japan

23 de maio de 2024