Saya baru-baru ini dilemparkan ke proyek aplikasi web Java, dan saya telah menemukan sejumlah kelas yang mengikuti jenis format ini:
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
}
}
Sepertinya ini bisa diselesaikan dengan kode berikut, yang bagi saya tampaknya lebih mudah dibaca.
public class MyThingy {
public static void doSomething (int p1, String p2, …) throws Throwable {
//do stuff
}
}
Satu-satunya keuntungan yang bisa saya lihat dari melakukannya dengan cara pertama, adalah bahwa jika Anda harus memecah eksekusi () menjadi bagian-bagian yang lebih kecil, mereka semua dapat berbagi parameter awal tanpa harus secara eksplisit membagikannya. Tapi ini mungkin hanya menguntungkan pemodal malas, karena menjadi sulit bagi pembaca untuk mengetahui metode mana yang membutuhkan parameter mana dan kapan nilainya dapat diubah (mirip dengan variabel global.)
Apakah ada sesuatu yang saya lewatkan? Threading, kinerja?
Sunting: Saya seharusnya telah menyebutkan, meskipun konstruktor bersifat publik, tidak disebut. Satu-satunya penggunaan adalah seperti ini:
MyThingy.doSomething(p1, p2...);
Selain dari itu sendiri yang bermasalah untuk pengujian, saya tidak bisa melihat alasan untuk tidak menempatkan logika eksekusi () langsung ke doSomething (). Bahkan jika kita harus menyingkirkan fungsi statis, konstruktor masih tidak masuk akal bagi saya; Saya pikir parameter harus diteruskan langsung ke metode yang akan menggunakannya.
throws Throwable
adalah praktik yang buruk, itu harus setidaknya throws Exception
, atau sesuatu yang lebih spesifik, jika memungkinkan. Dan, karena praktik buruk biasanya muncul bersamaan, saya akan mengatakan bahwa templat kode ini hanyalah praktik buruk lainnya.
new(...)
+ execute()
dalam satu panggilan.
final
). Metode statis adalah satu-satunya API ke objek karena semua anggota bersifat pribadi. Hanya dalam kode yang telah Anda bagikan, saya tidak melihat manfaatnya dengan membuat execute
metode statis dengan mengambil p1, p2, ....