Hi Michael,

Many thanks for your reply, I can definitely see your point.

I agree that it makes sense for EMPTY_MAP to have the same logic as Map.of() or 
unmodifiable(new HashMap()), which means that my suggestion cannot be applied 
to just EMPTY_MAP... but maybe that’s ok: maybe we can change all of them? If 
we keep the default implementation for Map.computeIfPresent in EMPTY_MAP, 
Map.of(), unmodifiableMap, etc., instead of overriding it to throw an 
exception, then:

- For cases where the key isn’t present (regardless of empty or non-empt map), 
the call will be a safe no-op.
- For cases where the key is present, the call will still throw UOE via the 
implementation of put()

I believe this would still respect the spec for Map.computeIfPresent while 
providing a more forgiving implementation (in the sense that it will avoid 
throwing an exception when possible).

Thoughts?
Abraham


> On 10 Jun 2019, at 14:27, Michael Rasmussen <michael.rasmus...@roguewave.com> 
> wrote:
> 
>> If I understand correctly, this class represents an immutable empty map. As
>> a result, operations like put or remove have been implemented to throw
>> UnsupportedOperationException; this makes sense to me. However, this is
>> also the implementation for computeIfPresent, which I believe may be too
>> disruptive: the definition of this method says “If the value for the
>> specified key is present and non-null, attempts to compute a new mapping
>> given the key and its current mapped value.“; for an empty map, this could
>> be a safe no-op, instead of an exception.
> 
> The spec for Map.computeIfPresent states that it should throw 
> UnsupportedOperationException if Map.put is not supported, which is the case 
> for this map.
> The exception is listed as "(optional)" though, for which the docs specify 
> "may throw an exception or it may succeed, at the option of the 
> implementation." so it's not entirely clear to me if it would be OK for 
> computeIfPresent to not throw.
> 
> That being said -- for me it makes more sense that Collections.emptyMap() 
> follows the same logic as Map.of(), or Collections.unmodifiableMap​(new 
> HashMap<>()) -- and the latter two both throw from computeIfPresent.
> 
> /Michael

Reply via email to