Optimizing Code in Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
$$
public class RedisCache {
// The client library we use to connect to Redis
private final RedisClient client;
public RedisCache() {
// The connection is setup inside the constructor
connection = new RedisClient("cache.mycompany.com");
}
}
This seems simple - and would work - but it has a potential issue
What if we don't need the Redis client at all?
public class RedisCache {
private RedisClient client;
// Instead of setting up the connection in the constructor,
// we only set it up when someone needs to get the client.
public RedisClient getClient() {
if (connection == null) {
connection = new RedisClient("cache.mycompany.com");
}
return connection;
}
}
// UserService needs cache access
public class UserService {
private RedisCache userCache = new RedisCache(); // First connection
}
// PaymentService also needs cache
public class PaymentService {
private RedisCache paymentCache = new RedisCache(); // Second connection
}
// ...same for OrderService ...
public class RedisCache {
private static RedisCache instance;
private RedisClient client;
// The constructor is private so that we ensure we only
// create RedisCache inside this class
private RedisCache() {}
public static RedisCache getInstance()
// We only create a RedisCache if one does not already exist
if (instance == null) { instance = new RedisCache(); }
return instance;
}
// ... The rest is the same as before ...
}
Optimizing Code in Java