Benefício do uso de classe de construtor interno estático

9

Durante o curso de redação das diretrizes de código para uma empresa, me vi recomendando o uso do padrão Builder do Effective Java, em vez de construtores telescópicos.

No entanto, depois de pensar um pouco mais, certamente uma solução mais elegante é apenas remover a classe do construtor e também remover os construtores extras com argumentos opcionais.

Portanto, basta ter o construtor com os parâmetros necessários, getters / setters normais e comentar o código. Ao implementar, crie uma nova instância do objeto yr e defina os valores.

Meu pensamento original era o benefício de remover a confusão sobre quais parâmetros eram opcionais e quais eram necessários; no entanto, o verdadeiro benefício vem do uso do encadeamento de métodos / interface fluente.

O padrão do construtor possui benefícios quando você cria muitas novas instâncias, pois o ide pode fazer o trabalho da perna e também se houver muitos (15+) parâmetros opcionais. No entanto, vale a pena o tempo extra codificando a classe interna estática, você recomendaria usar o construtor ou é uma perda de tempo?

NimChimpsky
fonte
Veja também stackoverflow.com/a/1953567/632951
Pacerier 17/08/14

Respostas:

8

Costumo seguir um padrão em que os construtores devem fornecer todos os valores obrigatórios necessários para criar um objeto válido e consistente . Para valores opcionais, tento pensar sobre qual deve ser o padrão mais comum, para que os setters sejam usados ​​o mínimo possível.

Se eu achar que existem muitos valores opcionais ou que uma proporção maior de valores opcionais tende a ser alterada em relação aos padrões, utilizarei o padrão do construtor (construtor interno estático ou outro design semelhante).

Josh geralmente dá conselhos muito bons - a melhor coisa que eu gosto nele é que os conselhos vêm das trincheiras - ele se admite que cometeu erros ao projetar partes de Java, e Java eficaz é em parte o tipo de sua 'cura' para falar :-)

Martijn Verburg
fonte
11
Isso não diz nada sobre por que o interior deve ser estático ...
Jimmy Hoffa
Imutabilidade e efeitos colaterais gratuitos também são um objetivo.
Martijn Verburg
6

O padrão Builder de Josh Bloch, como o GoF Builder Pattern, oferece uma maneira de criar um objeto imutável com muitos dados padrão sem longas listas de construtores encadeados.

Se você "tiver o único construtor com os parâmetros necessários, getters / setters normais", seu objeto não será mais imutável. ie Você pode alterá-lo muito tempo depois de instanciar.

Se isso não for um problema para você, você nunca precisou do padrão Builder. Se for um problema, sua solução será falha.

pdr
fonte
Eu não acho que o padrão do construtor tenha algo a ver com a mutabilidade, mesmo o exemplo do gof no wiki é mutável ... en.wikipedia.org/wiki/Builder_pattern#Java também, o padrão tem os benefícios que descrevi na pergunta.
NimChimpsky 5/11
3
@NimChimpsky: Se o padrão do Construtor pode ser aplicado para criar um objeto mutável não está em questão. A questão é, você deveria? Os getters e setters existem há toda a eternidade, onde os objetos podem ser mutáveis, eles são uma solução perfeitamente sólida, mas as pessoas enfrentam um problema comum na criação de objetos imutáveis: cadeias incontroláveis ​​de construtores. O Builder era uma solução comum e, portanto, tornou-se um padrão, para facilitar a comunicação.
Pd5