Java - Kelas Singleton
Hai sana, para ahli Java masa depan! Hari ini, kita akan melihat salah satu konsep yang paling menarik dalam pemrograman Java: Kelas Singleton. Jangan khawatir jika Anda baru dalam pemrograman; saya akan memandu Anda melalui perjalanan ini langkah demi langkah, seperti yang saya lakukan untuk ribuan murid selama tahun-tahun mengajar saya. Jadi, ambil minuman favorit Anda, rajin diri, dan mari kita mulai petualangan menarik ini bersama!
Apa Itu Kelas Singleton?
Bayangkan Anda adalah manajer dari sebuah klub yang sangat eksklusif. Klub ini sangat eksklusif sehingga hanya bisa ada satu instance di seluruh dunia. Itu sebenarnya apa arti kelas Singleton dalam Java - kelas yang hanya mengijinkan satu instance dari dirinya sendiri untuk diciptakan.
Mengapa Menggunakan Singleton?
Mungkin Anda berpikir, " Mengapa kita ingin membatasi diri hanya ke satu instance saja?" Ada beberapa alasan:
- Titik akses global: Itu menyediakan satu titik akses ke instance tertentu, membuatnya mudah untuk memelihara state global dalam aplikasi.
- Inisialisasi malas: Instance diciptakan hanya saat diperlukan, menyimpan sumber daya.
- Keselamatan thread: Ketika diterapkan dengan benar, itu bisa keselamatan thread, mengijinkan hanya satu instance bahkan dalam lingkungan multi-thread.
Sekarang, mari kita lihat bagaimana kita bisa menciptakan kelas Singleton dalam Java.
Menciptakan Kelas Singleton
Ada beberapa cara untuk menciptakan kelas Singleton, tapi kita akan mulai dengan metode paling sederhana dan paling umum: inisialisasi segera.
public class EagerSingleton {
// Private static instance of the class
private static final EagerSingleton instance = new EagerSingleton();
// Private constructor to prevent instantiation
private EagerSingleton() {}
// Public method to return the instance
public static EagerSingleton getInstance() {
return instance;
}
}
mari kitauraikan ini:
- Kita deklarasikan sebuah variabel
private static final
instance
dari jenis kelas ini. Ini adalah instance tunggal yang akan ada. - Konstruktor pribadi, mencegah inisialisasi oleh kelas lain.
- Metode
public static
getInstance()
yang mengembalikan instance tunggal.
Untuk menggunakan Singleton ini:
EagerSingleton singleton = EagerSingleton.getInstance();
Mudah, kan? Tetapi apa kalau kita ingin menciptakan instance hanya saat diperlukan? Itu di mana inisialisasi malas masuk.
Inisialisasi Malas
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
Dalam versi ini, instance diciptakan hanya saat getInstance()
dipanggil untuk pertama kalinya. Namun, ini tidak keselamatan thread. Dalam lingkungan multi-thread, kita mungkin akan menciptakan beberapa instance. Mari kita perbaiki itu!
Singleton Keselamatan Thread
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static synchronized ThreadSafeSingleton getInstance() {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
return instance;
}
}
Dengan menambahkan kata kunci synchronized
ke metode getInstance()
, kita memastikan bahwa hanya satu thread yang dapat menjalankan metode ini pada satu waktu. Namun, sinkronisasi itu mahal, dan kita hanya membutuhkannya saat instance pertama kali diciptakan. Di sana masuk pola double-checked locking!
Double-Checked Locking
public class DoubleCheckedSingleton {
private static volatile DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}
Pola ini memeriksa null dua kali: sekali tanpa penguncian dan sekali dengan penguncian. Kata kunci volatile
memastikan bahwa beberapa thread menangani variabel instance
dengan benar.
Implementasi Singleton Bill Pugh
Sekarang, mari saya bagikan metode favorit saya untuk mengimplementasikan Singleton, dinamai sesuai dengan penciptornya, Bill Pugh:
public class BillPughSingleton {
private BillPughSingleton() {}
private static class SingletonHelper {
private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}
public static BillPughSingleton getInstance() {
return SingletonHelper.INSTANCE;
}
}
Metode ini menggunakan kelas static inner untuk menjaga instance. Itu keselamatan thread tanpa menggunakan sinkronisasi dan memuat instance malas saat getInstance()
dipanggil untuk pertama kalinya.
Kapan Menggunakan Singleton
Singletons bagus untuk:
- Mengelola sumber daya bersama (seperti koneksi database)
- Mengkoordinasikan aksi sistem-wide
- Mengelola pool sumber daya (seperti pool thread)
Namun, berhati-hati! Penggunaan berlebihan Singleton dapat membuat kode Anda sulit untuk diuji dan dipelihara.
Metode Singleton
Berikut adalah tabel metode umum yang Anda mungkin temui dalam kelas Singleton:
Metode | Deskripsi |
---|---|
getInstance() |
Mengembalikan instance tunggal kelas |
readResolve() |
Digunakan untuk serialisasi untuk menjaga properti Singleton |
clone() |
Biasanya melempar CloneNotSupportedException untuk mencegah cloning |
Kesimpulan
Wah! Kita telah meliputi banyak hal hari ini. Dari memahami apa itu Singleton, sampai mengimplementasikan jenis-jenis Singleton, Anda sekarang siap untuk menggunakan pola desain kuat ini dalam proyek Java Anda.
Ingat, seperti klub eksklusif yang kita bicarakan di awal, Singleton harus digunakan secara bijaksana. Itu adalah alat yang kuat, tapi dengan kekuatan yang besar datang tanggung jawab besar!
Sekarang, teruskan perjalanan Java Anda, terus coding, terus belajar, dan terutama, bersenang-senang! Siapa tahu? Mungkin suatu hari Anda akan mengajarkan generasi berikutnya tentang Singleton dan hal lainnya.
Sampaijumpa lagi, coding yang bahagia!
Credits: Image by storyset