Tembel başlatma ve tekil örnek desenleri

Java'da Kod Optimizasyonu

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Bir Redis önbellek istemcisi oluşturma

  • Redis'e erişen bir önbellek istemcisi geliştirdiğimizi düşünün
  • Redis istemcimiz bir üçüncü taraf sağlayıcıda barındırılıyor
  • İstemciye bağlanmak ağ çağrısı gerektirir; bunun 500 ms sürdüğünü varsayın

$$

Redis bağlantısını kurmak için ağ üzerinden çağrı

Java'da Kod Optimizasyonu

Basit (erken) bir uygulama

public class RedisCache {
    // Redis'e bağlanmak için kullandığımız istemci kütüphanesi
    private final RedisClient client;

    public RedisCache() {
        // Bağlantı kurucu içinde ayarlanır
        connection = new RedisClient("cache.mycompany.com");
    }
}
  • Redis bağlantısının erken (eager) başlatılması
Java'da Kod Optimizasyonu

Bu yaklaşımın olası bir sorunu

Bu basit görünüyor ve çalışır; ancak olası bir sorun var

Ya Redis istemcisine hiç ihtiyacımız yoksa?

  • Başlangıçta değerli zaman harcanır
  • Gereksiz bağlantılar kurulur
Java'da Kod Optimizasyonu

Tembel başlatma

public class RedisCache {
    private RedisClient client;

    // Bağlantıyı kurucuda yapmak yerine,
    // yalnızca biri istemciyi istediğinde kurarız.
    public RedisClient getClient() {
        if (connection == null) {
            connection = new RedisClient("cache.mycompany.com");
        }
        return connection;
    }
}
Java'da Kod Optimizasyonu

Yaklaşımımızla ilgili başka bir sorun

// UserService önbelleğe erişime ihtiyaç duyar
public class UserService {
    private RedisCache userCache = new RedisCache();  // İlk bağlantı
}

// PaymentService de önbelleğe ihtiyaç duyar
public class PaymentService {
    private RedisCache paymentCache = new RedisCache();  // İkinci bağlantı
}

// ...OrderService için de aynı...
Java'da Kod Optimizasyonu

Tekil örnek (singleton) deseni

public class RedisCache {
    private static RedisCache instance;
    private RedisClient client;

    // Yalnızca bu sınıf içinde RedisCache oluşturduğumuzdan emin olmak için kurucu özeldir
    private RedisCache() {}

    public static RedisCache getInstance() 
        // Yalnızca yoksa bir RedisCache oluştururuz
        if (instance == null) { instance = new RedisCache(); }
        return instance;
    }
    // ... Geri kalanı öncekiyle aynı ...

}
Java'da Kod Optimizasyonu

Hadi pratik yapalım!

Java'da Kod Optimizasyonu

Preparing Video For Download...