Optional's constructor preloads valueStr and valueHash for its toString() and hashCode() methods respectively, even when those methods are never invoked during the life of the object.
It incurs unnecessary overhead, and the problem becomes worse if the size of value is huge and T's hashcode() requires heavy computation.
They should be done in toString() and hashCode() methods on demand, respectively like below:
+As a related issue, when value is null, it's better to return a reference of a static variable for empty Optional, not making separate objects every time. The following is the current code.