abstract class Cacheable { Object _cached; abstract Object retrieve(); Object get() { if (_object == null) _cached = retrieve(); return _cached;} } class CacheableA { A retrieve() { return retrieveA();} String retrieveA() { return "asdfasdf";} } class CachableB { B retrieve() { return retrieveB();} Integer retrieveB() { return new Integer(42);} } public class Foo { Cacheable _a = new CacheableA(); Cacheable _b = new CacheableB(); public String a() { return a.get(); } public Integer b() { return b.get(); } }