[BUG] java.util.Properties.entrySet() does not override java.lang.Object methods since Java 9

Rob Spoor openjdk at icemanx.nl
Sat May 23 19:13:16 UTC 2020


I was working on upgrading a library of mine from Java 8 to 11, and I 
noticed my unit tests started failing. Some investigation showed that in 
Java 9, java.util.Properties was rewritten to no longer rely on the fact 
that it extends Hashtable. One of the changes was to use a private 
static class called EntrySet. However, while this class implements most 
methods from java.util.Set, it's actually missing two: equals and 
hashCode. As a result it does not adhere to the general contract of 
java.util.Set. It's also missing a toString implementation, thereby 
inheriting its String representation from java.lang.Object. I've checked 
the source code up to Java 14, and even the Mercurial repository, and 
this issue still exists.

I think this could be solved as simply as by having this private 
EntrySet class extend AbstractSet, or otherwise delegate its methods to 
its entrySet field. The latter is probably preferred, as it matches the 
implementation of the same methods of the java.util.Properties class itself.


More information about the core-libs-dev mailing list