Recentemente, fui lançado em um projeto de aplicativo da web Java e deparei-me com várias classes que seguem esse tipo de formato:
public class MyThingy {
private final int p1;
private final String p2;
…
public MyThingy (int p1, String p2, …) {
this.p1 = p1;
this.p2 = p2;
…
}
public static void doSomething(int p1, String p2, …) throws Throwable {
final MyThingy myThingy = new MyThingy(p1, p2, …);
myThingy.execute();
}
private void execute() throws Throwable {
//do stuff
}
}
Parece que isso poderia ser realizado com o código a seguir, que para mim parece muito mais fácil de ler.
public class MyThingy {
public static void doSomething (int p1, String p2, …) throws Throwable {
//do stuff
}
}
O único benefício possível que vejo ao fazê-lo da primeira maneira é que, se você tivesse que dividir execute () em partes menores, todos eles poderiam compartilhar os parâmetros iniciais sem precisar explicitamente explicá-los. Mas isso talvez beneficie apenas o codificador lento, pois fica difícil para o leitor dizer quais métodos precisam de quais parâmetros e quando os valores podem ser alterados (semelhante a variáveis globais).
Tem algo que estou perdendo? Rosqueamento, desempenho?
Edit: Eu deveria ter mencionado, embora o construtor seja público, não é chamado. O único uso é assim:
MyThingy.doSomething(p1, p2...);
Além de ser problemático para o teste, não vejo motivo para não colocar a lógica de execute () diretamente em doSomething (). Mesmo se nos livrássemos da função estática, o construtor ainda não faz sentido para mim; Eu acho que os parâmetros devem ser passados diretamente para o método que os usará.
throws Throwableé uma prática ruim, deve ser pelo menos throws Exceptionou algo mais específico, se possível. E, como as práticas ruins geralmente se reúnem, eu diria que esse modelo de código é apenas outra prática ruim.
new(...)+ execute()em uma chamada.
final). O método estático é a única API no objeto, pois todos os membros são privados. Em apenas o código que você compartilhou, eu não vejo nenhum benefício para este sobre tornando executeum método estático tomar p1, p2, ....