Singleton
Konsep Singleton
Singleton adalah kelas yang hanya dapat membuat satu instance. Contoh khas singleton adalah objek tanpa status atau komponen sistem yang unik. Namun, kelas singleton sulit diuji jika tidak didefinisikan sebagai tipe dengan antarmuka dan implementasinya.
Cara Membuat Singleton
Metode anggota publik statis yang merupakan field final
Konstruktor privat hanya dipanggil sekali saat inisialisasi Elvis instance dan menjamin bahwa instance tersebut unik di seluruh sistem. Namun, AccessibleObject.setAccessible() dapat digunakan untuk memanggil konstruktor privat, dan metode refleksi ini dapat dicegah dengan melempar pengecualian saat instance kedua dibuat.
- Keuntungan
- Kelas tersebut secara eksplisit dinyatakan sebagai singleton di API.
- Ringkas.
Metode pabrik statis publik yang disediakan
Selain modifikasi melalui refleksi, metode ini juga menjamin bahwa instance tersebut unik di seluruh sistem. Hanya saja field diubah menjadi private dan pengembalian objek dilakukan melalui metode pabrik statis.
- Keuntungan
- Singleton dapat diubah menjadi bukan singleton tanpa mengubah API.
- Misalnya, metode pabrik statis dapat dibuat untuk mengembalikan instance yang berbeda untuk setiap thread.
- Jika diinginkan, dapat diubah menjadi metode pabrik singleton generik.
- Referensi metode pabrik dapat digunakan sebagai pemasok.
- Misalnya, Elvis::getInstance dapat digunakan sebagai Supplier<Elvis>.
- Singleton dapat diubah menjadi bukan singleton tanpa mengubah API.
Jika tidak perlu memanfaatkan keuntungan di atas, lebih baik menggunakan metode pertama.
Menggunakan tipe enumerasi
Metode yang paling disukai adalah menggunakan tipe enumerasi. Dibandingkan dengan dua metode di atas, metode ini aman dari serangan refleksi dan kodenya lebih bersih. Selain itu, seperti yang akan dibahas nanti, dua metode di atas memiliki kelemahan yaitu membutuhkan kode tambahan saat diserialisasi.
Namun, perlu diperhatikan bahwa singleton yang ingin dibuat dapat mewarisi antarmuka tetapi tidak dapat mewarisi kelas.
Hal yang Perlu Diperhatikan Saat Menyerialisasi Kelas Singleton
Jika Anda ingin menyerialisasi kelas singleton yang dibuat dengan metode pertama atau kedua, Anda perlu melakukan lebih dari sekadar mengimplementasikan Serializable. Semua field instance harus dideklarasikan sebagai transient dan Anda harus menimpa metode readResolve() dan menyediakannya.
Komentar0