私は最近、Java Webアプリケーションプロジェクトに夢中になり、このタイプの形式に従う多くのクラスに遭遇しました。
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
}
}
これは次のコードで達成できるように思えます。
public class MyThingy {
public static void doSomething (int p1, String p2, …) throws Throwable {
//do stuff
}
}
最初の方法でそれを実行することでわかる唯一の利点は、execute()をより小さな部分に分割しなければならない場合、明示的に渡さなくても、すべて初期パラメーターを共有できることです。しかし、リーダーがどのメソッドにどのパラメーターが必要か、いつ値が変更される可能性があるか(グローバル変数のように)を伝えるのが難しくなるため、これはレイジーコーダーにのみメリットがあります。
行方不明のものはありますか?スレッド、パフォーマンス?
編集:私は言及したはずですが、コンストラクタはパブリックですが、呼び出されません。唯一の使用法は次のとおりです。
MyThingy.doSomething(p1, p2...);
これ自体はテストに問題があることを除けば、execute()のロジックを直接doSomething()に入れない理由はありません。静的関数を取り除いたとしても、コンストラクタはまだ意味がありません。パラメータは、それらを使用するメソッドに直接渡す必要があると思います。
throws Throwable
、これは悪い習慣throws Exception
です。可能であれば、少なくとも、またはより具体的なものにする必要があります。そして、悪い習慣は通常一緒になるので、このコードテンプレートは単なるもう一つの悪い習慣だと思います。
new(...)
+ を実行するためのヘルパーにすぎませんexecute()
。
final
)。すべてのメンバーがプライベートであるため、静的メソッドはオブジェクトへの唯一のAPIです。あなたが共有しているだけのコードでは、私が作る上で、これにどんなメリットが表示されないexecute
P1、P2、...服用静的メソッドを