T (@NotNull H h) { T result = getCachedValueOrNull(h); if (result != null) { return result; } result = myFunction.fun(h); final long count = getModificationCount(h); h.putUserData(this, new SoftReference<>(new Pair<>(count, result))); return result; }