Inisialisasi malas dan pola singleton

Optimasi Kode di Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Membangun klien cache Redis

  • Bayangkan kita membangun klien cache yang terhubung ke Redis
  • Klien Redis kita dihosting oleh penyedia pihak ketiga
  • Menyiapkan koneksi memerlukan panggilan jaringan — misal butuh 500 ms

$$

Panggilan jaringan untuk membuat koneksi Redis

Optimasi Kode di Java

Implementasi sederhana (eager)

public class RedisCache {
    // Library klien untuk terhubung ke Redis
    private final RedisClient client;

    public RedisCache() {
        // Koneksi disiapkan di dalam konstruktor
        connection = new RedisClient("cache.mycompany.com");
    }
}
  • Inisialisasi awal (eager) koneksi Redis
Optimasi Kode di Java

Masalah potensial pada pendekatan ini

Ini tampak sederhana—dan akan berfungsi—tetapi berpotensi bermasalah

Bagaimana jika kita tidak butuh klien Redis sama sekali?

  • Waktu startup terbuang
  • Koneksi yang tidak perlu dibuat
Optimasi Kode di Java

Inisialisasi malas (lazy)

public class RedisCache {
    private RedisClient client;

    // Alih-alih menyiapkan koneksi di konstruktor,
    // kita menyiapkannya hanya saat klien dibutuhkan.
    public RedisClient getClient() {
        if (connection == null) {
            connection = new RedisClient("cache.mycompany.com");
        }
        return connection;
    }
}
Optimasi Kode di Java

Masalah lain pada pendekatan kita

// UserService membutuhkan akses cache
public class UserService {
    private RedisCache userCache = new RedisCache();  // Koneksi pertama
}

// PaymentService juga butuh cache
public class PaymentService {
    private RedisCache paymentCache = new RedisCache();  // Koneksi kedua
}

// ...begitu juga OrderService ...
Optimasi Kode di Java

Pola singleton

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

    // Konstruktor private agar RedisCache hanya dibuat
    // di dalam kelas ini
    private RedisCache() {}

    public static RedisCache getInstance() 
        // Buat RedisCache hanya jika belum ada
        if (instance == null) { instance = new RedisCache(); }
        return instance;
    }

    // ... Sisanya sama seperti sebelumnya ...
}
Optimasi Kode di Java

Ayo berlatih!

Optimasi Kode di Java

Preparing Video For Download...