Lazy-initialisatie en singleton-patronen

Code optimaliseren in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Een Redis-cacheclient bouwen

  • Stel: we bouwen een cacheclient die Redis aanroept
  • Onze Redis-client draait bij een externe provider
  • De verbinding opzetten kost een netwerkaanroep – stel 500 ms

$$

Aanroep over het netwerk om Redis-verbinding op te zetten

Code optimaliseren in Java

Een simpele (eager) implementatie

public class RedisCache {
    // De clientbibliotheek die we gebruiken om met Redis te verbinden
    private final RedisClient client;

    public RedisCache() {
        // De verbinding wordt in de constructor opgezet
        connection = new RedisClient("cache.mycompany.com");
    }
}
  • Eager initialisatie van een Redis-verbinding
Code optimaliseren in Java

Een mogelijk probleem met deze aanpak

Dit lijkt simpel – en werkt – maar heeft een mogelijk probleem

Wat als we de Redis-client helemaal niet nodig hebben?

  • We verspillen kostbare opstarttijd
  • We leggen onnodige verbindingen
Code optimaliseren in Java

Lazy-initialisatie

public class RedisCache {
    private RedisClient client;

    // In plaats van in de constructor de verbinding op te zetten,
    // doen we dat pas zodra iemand de client nodig heeft.
    public RedisClient getClient() {
        if (connection == null) {
            connection = new RedisClient("cache.mycompany.com");
        }
        return connection;
    }
}
Code optimaliseren in Java

Nog een probleem met onze aanpak

// UserService heeft cachetoegang nodig
public class UserService {
    private RedisCache userCache = new RedisCache();  // Eerste verbinding
}

// PaymentService heeft ook cache nodig
public class PaymentService {
    private RedisCache paymentCache = new RedisCache();  // Tweede verbinding
}

// ...idem voor OrderService ...
Code optimaliseren in Java

Het singleton-patroon

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

    // De constructor is privé zodat we RedisCache
    // alleen binnen deze klasse aanmaken
    private RedisCache() {}

    public static RedisCache getInstance() 
        // We maken alleen een RedisCache als er nog geen bestaat
        if (instance == null) { instance = new RedisCache(); }
        return instance;
    }

    // ... De rest is hetzelfde als eerder ...
}
Code optimaliseren in Java

Laten we oefenen!

Code optimaliseren in Java

Preparing Video For Download...