Hi,

This change is OK, but I was thinking that in general, for cases like this one, it would be better to check that the Set obtained from the 'graph' Map is already immutable and throw an exception if that is not the case. Like Objects.requireNonNull method, there could be a similar static method in Set interface:

static <T> Set<T> requireImmutable(Set<T> set)

Why is this better than Set.copyOf()? Because here we know that the parameter to Set.copyOf() is already an immutable Set and this method just returns it in that case. But what if some changes to internal logic fail to maintain this invariant? In that case Set.copyOf() would silently start copying the elements and returning new immutable instances.

In case that happens, Set.requireImmutable() would throw and it would be necessary to fix code so that the invariant is preserved or replace Set.requireImmutable() with Set.copyOf(). But that last option would be a conscious decision which trades correctness for performance, not a result of oversight.

Would such method addition be worth it?

Regards, Peter

On 3/26/19 2:54 PM, Alan Bateman wrote:
On 26/03/2019 13:44, Claes Redestad wrote:

Or with this less verbose comment (suggested offline by Alan):

diff -r 5ee30b6991a7 src/java.base/share/classes/java/lang/module/Configuration.java --- a/src/java.base/share/classes/java/lang/module/Configuration.java Mon Dec 03 16:25:27 2018 +0100 +++ b/src/java.base/share/classes/java/lang/module/Configuration.java Tue Mar 26 14:50:55 2019 +0100
@@ -575,7 +575,8 @@
     }

     Set<ResolvedModule> reads(ResolvedModule m) {
-        return Collections.unmodifiableSet(graph.get(m));
+        // The sets stored in the graph are already immutable sets
+        return Set.copyOf(graph.get(m));
     }
This looks good.

-Alan

Reply via email to