Saya memiliki kelas yang penuh dengan fungsi utilitas. Instantiasi contoh itu tidak masuk akal semantik, tapi saya masih ingin menyebut metodenya. Apa cara terbaik untuk menghadapi ini? Kelas statis? Abstrak?
Saya memiliki kelas yang penuh dengan fungsi utilitas. Instantiasi contoh itu tidak masuk akal semantik, tapi saya masih ingin menyebut metodenya. Apa cara terbaik untuk menghadapi ini? Kelas statis? Abstrak?
Jawaban:
Konstruktor pribadi dan metode statis pada kelas ditandai sebagai final.
Menurut buku hebat "Java Efektif" :
Butir 4: Menegakkan noninstantiability dengan konstruktor pribadi
- Berusaha untuk menegakkan noninstantiability dengan membuat abstrak kelas tidak berfungsi.
- Konstruktor default dihasilkan hanya jika kelas tidak mengandung konstruktor eksplisit, sehingga kelas dapat dibuat tidak dapat dibuktikan dengan menyertakan konstruktor pribadi:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Karena konstruktor eksplisit bersifat privat, konstruktor tidak dapat diakses di luar kelas. AssertionError tidak sepenuhnya diperlukan, tetapi menyediakan asuransi jika konstruktor secara tidak sengaja dipanggil dari dalam kelas. Ini menjamin bahwa kelas tidak akan pernah dipakai dalam keadaan apa pun. Ungkapan ini agak berlawanan dengan intuisi, karena konstruktor disediakan secara tegas sehingga tidak dapat dipanggil. Oleh karena itu bijaksana untuk memasukkan komentar, seperti yang ditunjukkan di atas.
Sebagai efek samping, idiom ini juga mencegah kelas menjadi subclass. Semua konstruktor harus memanggil konstruktor superclass, secara eksplisit atau implisit, dan subkelas tidak memiliki konstruktor superclass yang dapat diakses untuk dipanggil.
AssertionError
atas alternatif lain seperti IllegalStateException
, UnsupportedOperationException
, dll?
Kedengarannya seperti Anda memiliki kelas utilitas yang mirip dengan java.lang.Math .
Pendekatannya ada kelas akhir dengan konstruktor pribadi dan metode statis.
Tetapi berhati-hatilah dengan apa yang dilakukan untuk testabilitas, saya sarankan membaca artikel ini.
Metode Statis adalah Kematian untuk Testabilitas
Hanya untuk berenang di hulu, anggota dan kelas statis tidak berpartisipasi dalam OO dan karenanya jahat. Tidak, tidak jahat, tapi serius, saya akan merekomendasikan kelas reguler dengan pola akses tunggal. Dengan cara ini jika Anda perlu mengesampingkan perilaku dalam kasus apa pun di jalan, itu bukan perombakan besar. OO adalah temanmu :-)
$ 0,02 saya
mengomentari argumen "konstruktor pribadi": ayolah, pengembang tidak sebodoh itu; tapi mereka malas. membuat objek lalu memanggil metode statis? tidak akan terjadi.
jangan menghabiskan terlalu banyak waktu untuk memastikan kelas Anda tidak dapat disalahgunakan. memiliki keyakinan untuk kolega Anda. dan selalu ada cara untuk menyalahgunakan kelas Anda tidak peduli bagaimana Anda melindunginya. satu-satunya hal yang tidak dapat disalahgunakan adalah hal yang sama sekali tidak berguna.
Tidak ada gunanya mendeklarasikan kelas sebagai static
. Cukup deklarasikan metodenya static
dan panggil mereka dari nama kelas seperti biasa, seperti kelas Matematika Java .
Juga, meskipun tidak sepenuhnya membuat konstruktor pribadi, itu ide yang baik untuk melakukannya. Menandai konstruktor pribadi mencegah orang lain membuat instance kelas Anda, lalu memanggil metode statis dari instance tersebut. (Panggilan ini bekerja persis sama di Jawa, mereka hanya menyesatkan dan merusak keterbacaan kode Anda.)
Anda dapat menggunakan anotasi @UtilityClass dari lombok https://projectlombok.org/features/experimental/UtilityClass