Singleton
- Java kursu
- İleri seviye
- Ders 37/82
- 5 dk
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
// 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
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
Logger log = Logger.____();
Logger log = Logger.getInstance();
Açıklama: getInstance tek örneği döndürür.