Recientemente me lanzaron a un proyecto de aplicación web Java, y me he encontrado con varias clases que siguen este 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 esto podría lograrse con el siguiente código, que me parece mucho más fácil de leer.
public class MyThingy {
public static void doSomething (int p1, String p2, …) throws Throwable {
//do stuff
}
}
El único beneficio posible que puedo ver al hacerlo de la primera manera es que si tuviera que dividir execute () en partes más pequeñas, todos podrían compartir los parámetros iniciales sin tener que pasarlos explícitamente. Pero esto tal vez solo beneficie al codificador perezoso, ya que se vuelve difícil para el lector decir qué métodos necesitan qué parámetros y cuándo se pueden cambiar los valores (similares a las variables globales).
¿Se me escapa algo? Roscado, rendimiento?
Editar: Debería haber mencionado, aunque el constructor es público, no se llama. El único uso es así:
MyThingy.doSomething(p1, p2...);
Además de que esto en sí mismo es problemático para las pruebas, no veo ninguna razón para no poner la lógica de execute () directamente en doSomething (). Incluso si tuviéramos que deshacernos de la función estática, el constructor todavía no tiene sentido para mí; Creo que los parámetros deberían pasarse directamente al método que los usará.
throws Throwablees una mala práctica, debería ser al menos throws Exception, o algo más específico, si es posible. Y, dado que las malas prácticas generalmente se unen, diría que esta plantilla de código es solo otra mala práctica.
new(...)+ execute()en una llamada.
final). El método estático es la única API en el objeto ya que todos los miembros son privados. En sólo el código que has compartido, no veo ningún beneficio a este sobre la toma de executeun método estático teniendo p1, p2, ....