Poor man's lazy evaluation in Java 8
Your lazy method is not thread safe. If two threads check for the key at the same time they will both find it absent and both create a new object.

Wrapping your EnumMap in a ConcurrentMap will get around this.

private ConcurrentMap&lt;Field, Optional&gt; lazyThreadSafeAttributes = new ConcurrentHashMap(lazyAttributes);

private &lt;T&gt; Optional&lt;T&gt; lazyThreadSafeLookup(Field field, Supplier&lt;Optional&lt;T&gt;&gt; answer) {
    return lazyThreadSafeAttributes.computeIfAbsent(field, k -&gt; answer.get());
}