Há alguns meses, comecei a trabalhar em um novo projeto e, ao analisar o código, percebi a quantidade de métodos estáticos usados. Não apenas métodos utilitários collectionToCsvString(Collection<E> elements)
, mas também muita lógica de negócios é mantida neles.
Quando perguntei ao sujeito responsável pela lógica por trás disso, ele disse que era uma maneira de escapar da tirania de Spring . É algo em torno desse processo de pensamento: para implementar um método de criação de recibos de clientes, poderíamos ter um serviço
@Service
public class CustomerReceiptCreationService {
public CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Agora, o sujeito disse que não gosta de ter classes desnecessariamente gerenciadas pelo Spring, basicamente porque impõe a restrição de que as classes clientes devam ser elas próprias. Acabamos tendo tudo gerenciado pelo Spring, que praticamente nos obriga a trabalhar com objetos sem estado de maneira processual. Mais ou menos o que está indicado aqui https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
Então, em vez do código acima, ele tem
public class CustomerReceiptCreator {
public static CustomerReceipt createReceipt(Object... args) {
CustomerReceipt receipt = new CustomerReceipt();
// creation logic
return receipt;
}
}
Eu poderia argumentar a ponto de evitar que o Spring gerencie nossas aulas sempre que possível, mas o que não vejo é o benefício de ter tudo estático. Esses métodos estáticos também são sem estado, portanto, também não são muito OO. Eu me sentiria mais confortável com algo como
new CustomerReceiptCreator().createReceipt()
Ele afirma que os métodos estáticos têm alguns benefícios extras. Nomeadamente:
- Mais fácil de ler. Importe o método estático e precisamos nos preocupar apenas com a ação, não qual a classe que está fazendo isso.
- É obviamente um método livre de chamadas de banco de dados, tão barato em termos de desempenho; e é bom deixar claro, para que o cliente em potencial precise entrar no código e verificar isso.
- Mais fácil de escrever testes.
Mas sinto que há algo que não está completamente certo nisso, então gostaria de ouvir alguns pensamentos de desenvolvedores mais experientes sobre isso.
Então, minha pergunta é: quais são as possíveis armadilhas dessa maneira de programação?
static
método que você está ilustrando acima é apenas um método comum de fábrica. Tornar estáticos os métodos de fábrica é a convenção geralmente aceita, por vários motivos convincentes. Se o método de fábrica é apropriado aqui é outra questão.