Memiliki fungsi pembantu statis untuk membuat argumen konstruktor adalah solusi yang sangat masuk akal, tetapi fungsi ini terbatas dalam operasi apa yang dapat mereka lakukan karena mereka harus menghasilkan tepat satu argumen masing-masing, dan tidak dapat berkomunikasi satu sama lain.
Dalam kasus yang paling umum di mana Anda ingin mengadaptasi antarmuka Constructor(A, B, C)
ke antarmuka yang lebih bermanfaat Constructor(X, Y)
, Anda dapat menentukan konstruktor pembantu pribadi yang mengambil pribadi ArgumentObject
dan rantai ke konstruktor yang ada. Konstruktor yang lebih bermanfaat kemudian rantai ke konstruktor helper melalui fungsi helper statis untuk membuat objek argumen:
class Constructor {
// constructor you want to wrap
public Constructor(A a, B b, C c) { ... }
// better constructor you are defining
public Constructor(X x, Y y) { this(createArgumentObject(x, y)); }
// helper constructor using an ArgumentObject
private Constructor(ArgumentObject ao) { this(ao.a, ao.b, ao.c); }
// helper to create the argument object
private static ArgumentObject createArgumentObject(X x, Y y) { ... }
private static class ArgumentObject { ... }
}
Dalam bahasa yang tidak memiliki rangkaian konstruktor dalam kelas yang sama (seperti C ++ 03), Anda harus mendefinisikan subkelas perantara untuk konstruktor pembantu.
Namun, teknik ini hanyalah generalisasi dari penggunaan fungsi statis dalam argumen konstruktor. Solusi lain yang telah Anda usulkan memiliki berbagai kelemahan sehingga saya akan menghindarinya kecuali ada alasan yang sangat baik untuk memilihnya:
menerapkan pembangun yang baik membutuhkan banyak upaya untuk nilai yang sangat kecil. Jika konstruktor baru cukup sederhana, Anda dapat melakukannya tanpa pembangun. Dengan asumsi kelas yang Anda bungkus melakukan validasi yang kuat, Anda dapat membuat objek argumen publik sehingga argumen dapat diteruskan menggunakan Constructor(new Constructor.Arguments {{ foo = 42; bar = baz; }})
idiom.
menggunakan variabel statis yang dihitung dalam blok penginisialisasi statis masuk akal untuk data benar-benar statis, tetapi harus berhati-hati untuk menghindari keadaan global. Kecuali inisialisasi sangat sederhana, Anda harus menggunakan fungsi statis untuk menginisialisasi variabel-variabel ini agar inisialisasi dapat diuji. Sekarang, satu-satunya keuntungan daripada langsung menggunakan metode statis adalah bahwa nilai-nilai hanya dihitung sekali dan digunakan kembali untuk semua inisialisasi.
Karena pertanyaan Anda menunjukkan inisialisasi ini bisa lebih kompleks, menggunakan blok penginisialisasi statis adalah besar tidak-tidak jika testabilitas penting bagi Anda. (Jika tidak, Anda memiliki masalah yang lebih mendesak.)