Ich wurde kürzlich in ein Java-Webanwendungsprojekt hineingeworfen und bin auf eine Reihe von Klassen gestoßen, die diesem Format folgen:
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
}
}
Es scheint, dass dies mit dem folgenden Code erreicht werden könnte, der mir viel einfacher zu lesen scheint.
public class MyThingy {
public static void doSomething (int p1, String p2, …) throws Throwable {
//do stuff
}
}
Der einzig mögliche Vorteil, den ich auf die erste Weise sehen kann, ist, dass wenn Sie execute () in kleinere Teile aufteilen müssten, diese alle die Anfangsparameter gemeinsam nutzen könnten, ohne sie explizit weitergeben zu müssen. Dies kommt jedoch möglicherweise nur dem faulen Codierer zugute, da der Leser nur schwer erkennen kann, welche Methoden welche Parameter benötigen und wann die Werte möglicherweise geändert werden (ähnlich wie bei globalen Variablen).
Fehlt mir etwas? Threading, Leistung?
Edit: Ich hätte erwähnen sollen, obwohl der Konstruktor öffentlich ist, wird er nicht aufgerufen. Die einzige Verwendung ist wie folgt:
MyThingy.doSomething(p1, p2...);
Abgesehen davon, dass dies an sich für das Testen problematisch ist, sehe ich keinen Grund, die Logik von execute () nicht direkt in doSomething () zu setzen. Selbst wenn wir die statische Funktion loswerden würden, macht der Konstruktor für mich immer noch keinen Sinn. Ich denke, die Parameter sollten direkt an die Methode übergeben werden, die sie verwendet.
throws Throwable
eine schlechte Praxis, sollte es zumindest throws Exception
oder etwas Spezifischeres sein, wenn möglich. Und da schlechte Praktiken normalerweise zusammenkommen, würde ich sagen, dass diese Codevorlage nur eine weitere schlechte Praxis ist.
new(...)
+ execute()
in einem Aufruf auszuführen .
final
). Die statische Methode ist die einzige API im Objekt, da alle Mitglieder privat sind. In nur dem Code, den Sie geteilt haben, sehe ich keine Vorteile gegenüber execute
einer statischen Methode, die p1, p2, ... nimmt