Java - Kelas Singleton

Hai teman-teman, para ahli Java masa depan! Hari ini, kita akan mendalami salah satu konsep yang sangat menarik dalam pemrograman Java: Kelas Singleton. Jangan khawatir jika Anda baru dalam pemrograman; saya akan memandu Anda dalam perjalanan ini langkah demi langkah, sama seperti yang saya lakukan bagi ribuan murid selama tahun-tahun mengajar saya. Jadi, ambil minuman favorit Anda, duduk nyaman, dan mari kita memulai petualangan menarik ini bersama!

Java - Singleton Class

Apa Itu Kelas Singleton?

Bayangkan Anda adalah manajer dari sebuah klub yang sangat eksklusif. Klub ini begitu eksklusif sehingga hanya bisa ada satu instance nya di seluruh dunia. Itu sebenarnya apa yang dimaksudkan oleh kelas Singleton dalam Java - kelas yang hanya mengijinkan satu instance dari dirinya sendiri untuk diciptakan.

Mengapa Menggunakan Singleton?

Anda mungkin bertanya-tanya, " Mengapa kita ingin membatasi diri kita hanya ke satu instance saja?" Ada beberapa alasan:

  1. Titik akses global: Ini menyediakan satu titik akses ke instance tertentu, membuatnya mudah untuk memelihara state global dalam sebuah aplikasi.
  2. Inisialisasi malas: Instance diciptakan hanya saat itu diperlukan, menyaving resource.
  3. 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 membuat kelas Singleton dalam Java.

Membuat Kelas Singleton

Ada beberapa cara untuk membuat kelas Singleton, tapi kita akan mulai dengan metode yang paling sederhana dan paling umum: inisialisasi segera (eager initialization).

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:

  1. Kita deklarasikan sebuah variabel private static final instance dari jenis kelas. Ini adalah instance tunggal yang akan pernah ada.
  2. Konstruktor adalah private, mencegah kelas lain menciptakan instance baru.
  3. Kita menyediakan sebuah metode public static getInstance() yang mengembalikan instance tunggal.

Untuk menggunakan Singleton ini:

EagerSingleton singleton = EagerSingleton.getInstance();

Simple, kan? Tetapi, apa jika kita ingin menciptakan instance hanya saat itu diperlukan? Itu di mana inisialisasi malas (lazy initialization) masuk.

Inisialisasi Malas (Lazy Initialization)

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 saat yang bersamaan. Namun, sinkronisasi itu mahal, dan kita hanya membutuhkannya saat instance pertama kali diciptakan. Di sini 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 berbagi implementasi Singleton favorit saya, dinamai sesuai 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;
}
}

Pendekatan ini menggunakan kelas inner statis untuk menahan instance. Itu keselamatan thread tanpa menggunakan sinkronisasi dan memuat instance secara malas saat getInstance() dipanggil untuk pertama kalinya.

Kapan Menggunakan Singleton

Singletons cocok untuk:

  1. Mengelola sumber daya bersama (seperti koneksi database)
  2. Mengkoordinasi aksi sistem-wide
  3. Mengelola pool sumber daya (seperti pool thread)

Namun, hati-hati! Menggunakan Singleton terlalu banyak bisa membuat kode Anda sulit untuk diuji dan dipelihara.

Metode Singleton

Berikut adalah tabel metode umum yang Anda mungkin temukan dalam kelas Singleton:

Metode Deskripsi
getInstance() Mengembalikan instance tunggal kelas
readResolve() Digunakan untuk serialisasi untuk menjaga properti Singleton
clone() Biasanya melempar CloneNotSupportedException untuk mencegah克隆

Kesimpulan

Wah! Kita telah meliputi banyak hal hari ini. Dari memahami apa itu Singleton, hingga mengimplementasikan berbagai jenis Singleton, Anda sekarang telah siap untuk menggunakan pola desain yang kuat ini dalam proyek Java Anda.

Ingat, seperti klub eksklusif yang kita bicarakan di awal, Singleton harus digunakan dengan bijak. Itu adalah alat yang kuat, tapi dengan kekuatan yang besar datang tanggung jawab yang besar!

Bila Anda terus menjalani perjalanan Java Anda, Anda akan menemukan banyak konsep menarik lainnya. Terus coding, terus belajar, dan terutama, bersenang-senang! Siapa tahu? Mungkin suatu hari Anda akan menjadi pengajar generasi berikutnya tentang Singleton dan hal lainnya.

Sampaijumpa lagi, coding yang menyenangkan!

Credits: Image by storyset