CodeBlanks Logo Icon CodeBlanks

Singleton

Singleton desenini Java'da yazmayı öğrenirsin.

Singleton deseni

Singleton, bir sınıftan yalnızca tek bir örnek (instance) olmasını garanti eder. Bu örnek uygulamaya genel olur: ayarlar, önbellek veya günlük (log) gibi tek kayıt noktaları için kullanılır.

Üç temel parçası vardır: private kurucu dışarıdan new ile örnek oluşturulmasını engeller; private static alan tek örneği tutar; public static getInstance yöntemi bu örneği döndürür. İlk çağrıda örnek oluşturulur, sonraki çağrılar aynı örneği verir.

Tembel ve iş parçacığı güvenli

En basit Singleton, örneği ilk getInstance çağrısında oluşturur (tembel başlatma). Ancak birden çok iş parçacığı aynı anda çağrı yaparsa iki örnek oluşabilir. Bunu önlemek için synchronized ya da çift denetimli kilitleme kullanılır.

Java'da en sağlam yol, bazen bir enum kullanmaktır: enum Singleton { INSTANCE; }. Enum sabitleri doğal olarak tek örneklidir ve iş parçacığı güvenlidir. Bu yüzden modern kodlarda enum tabanlı Singleton tercih edilir.

Uygulama Singleton ile tek örnek garanti et

Bir Logger Singleton sınıfı yaz: private static Logger instance alanı, private kurucu ve public static Logger getInstance() yöntemi (ilk çağrıda örnek oluştursun). main içinde iki kez getInstance al ve a == b sonucunu System.out.println ile yazdır.

Başlangıç kodu

Main.java
// Logger Singleton sınıfını tanımla
// özel kurucu ve getInstance ekle
// main içinde iki örneği karşılaştır

Örnek çözüm

Main.java
class Logger {
    private static Logger instance;
    private Logger() { }
    public static Logger getInstance() {
        if (instance == null) instance = new Logger();
        return instance;
    }
}

public class SingletonDemo {
    public static void main(String[] args) {
        Logger a = Logger.getInstance();
        Logger b = Logger.getInstance();
        System.out.println(a == b);
    }
}

Beklenen çıktı

true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Singleton parçalarını eşleştir

Kavram Anlamı
private kurucu new'i engeller
private static alan Tek örneği tutar
getInstance Örneği döndürür
static Sınıf düzeyinde erişim

2 Singleton'da dışarıdan new ile yeni örnek oluşturulmasını engelleyen öğe hangisidir?

  • private kurucu Doğru cevap
  • public static alan
  • static getInstance
  • final alan

Açıklama: private kurucu dışarıdan new çağrısını engeller.

3 getInstance çağrısını tamamla

Soru
Logger log = Logger.____();
Cevap
Logger log = Logger.getInstance();

Açıklama: getInstance tek örneği döndürür.

İleri seviye bölümündeki tüm dersler