제이온

[Effective Java] Item 2. Considere o construtor se houver muitos parâmetros no construtor

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

Criado: 2024-04-27

Criado: 2024-04-27 00:46

Padrão de Construtor Gradual

Tanto fábricas estáticas quanto construtores têm dificuldades em lidar adequadamente com um grande número de parâmetros. Por exemplo, se uma classe tem 6 campos e você deseja criar construtores para quando houver 2 parâmetros, 3 parâmetros, ..., você pode usar o padrão de construtor gradual, conforme mostrado abaixo.



No entanto, mesmo isso pode tornar o código difícil de ler quando há muitos parâmetros, tornando difícil entender o significado de cada valor e levando a confusões sobre quais parâmetros do mesmo tipo devem ser usados.


Padrão JavaBeans

O padrão JavaBeans cria um objeto usando um construtor sem parâmetros e, em seguida, chama os métodos setter para definir os valores dos parâmetros desejados.



O padrão JavaBeans permite que você crie instâncias sem confusão, mesmo com muitos parâmetros. No entanto, criar um objeto exige várias chamadas para métodos setter, e a consistência é quebrada até que o objeto esteja totalmente construído. Por esse motivo, a classe não pode ser imutável.


Padrão Builder

O padrão Builder é frequentemente usado porque combina a segurança do padrão de construtor gradual com a legibilidade do padrão JavaBeans.

Em vez de criar o objeto diretamente, o cliente chama o construtor com apenas os parâmetros obrigatórios para obter um objeto construtor. Em seguida, ele define os parâmetros opcionais usando uma espécie de método setter fornecido pelo objeto construtor. Finalmente, ele chama o método `build()` sem parâmetros para obter o objeto desejado.



O construtor na classe `Builder` recebe apenas os parâmetros obrigatórios, e os parâmetros opcionais restantes são definidos usando uma espécie de método setter. Finalmente, o método `build()` é usado para criar o objeto `NutritionFactsWithBuilderPattern` completo. A classe `NutritionFactsWithBuilderPattern` é imutável e os métodos setter do construtor retornam o próprio construtor, permitindo que eles sejam chamados em sequência. Esse método é chamado de API fluente ou encadeamento de métodos.



Do ponto de vista do cliente, o padrão Builder torna o código mais fácil de escrever e ler.


Padrão Builder é bem adequado para classes hierárquicas


A classe `Pizza.Builder` é um tipo genérico que usa restrição de tipo recursivo e adiciona um método abstrato chamado `self()` para que as subclasses possam suportar o encadeamento de métodos sem conversões. Nas subclasses, este método abstrato retorna a si mesmo.

Agora, vamos analisar as pizzas de Nova York e Calzone como subclasses de Pizza para ver a flexibilidade do padrão Builder.



O método `build()` definido pelo construtor de cada subclasse retorna a subclasse concreta. A capacidade de um método em uma subclasse retornar um tipo que é um subtipo do tipo retornado pelo mesmo método na superclasse é chamada de retorno covariante. Isso elimina a necessidade de conversões para o cliente.



O cliente pode usar as enumerações de `Pizza` e de cada subclasse e construir objetos usando os métodos adequados.


Desvantagens do Padrão Builder

  • Um objeto construtor precisa ser criado.
  • O código pode ficar muito extenso.


Resumo

Se um construtor ou método de fábrica estática precisa lidar com muitos parâmetros, considere o padrão Builder.


Fontes

  • Effective Java

Comentários0