On 5/9/16 7:25 AM, Remi Forax wrote:
I still think that the code of hasNext of the iterator of SetN and MapN should 
not do any side effect.

Yes, I'm happy to consider further cleanups. I was starting to go off into the weeds with refactoring and cleanups, since they were introducing regressions, so I decided to check in a stable version and continue with cleanups later.

You had suggested to gather the searching code into a nextIndex() method, which is called from the constructor and from next(), in order to simplify hasNext(). I see that HashMap's HashIterator is done this way, and in fact the search code isn't in a method -- it's replicated between the constructor and nextNode(). See HashMap.java lines 1477 and 1493. [1] [2]

My question is, does this really buy anything? In a typical while(hasNext())/next() loop, the same work will get done, just in a different place.


[1] http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/4da0f73ce03a/src/java.base/share/classes/java/util/HashMap.java#l1477

[2] http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/4da0f73ce03a/src/java.base/share/classes/java/util/HashMap.java#l1493


otherwise,
  in the constructor of MapN, you can declare k and v as Object
    (the table is an array of Object and probe() now takes an Object)

Yes, good point.

   also instead of InternalError, i think AssertionError is a better exception,
    the javadoc of InternalError says that InternalError is thrown by the VM.

Hm. I agree that InternalError seems wrong since it's a subtype of VirtualMachineError. But it's used about 2x more frequently than AssertionError in the JDK.

  in MapN.probe, you can remove the cast to K (and the corresponding 
@SuppressWarnings).

Yes.

  Set2.e0 and Set2.e1 should be declared as package-private otherwise, the 
compiler generates an accessor in the iterator. Same thing for SetN.elements, 
MapN.table and MapN.size

I guess I privatized too many things. (But I'm no David Cameron.)

  CollSer implementation can be improved to avoid the ugly switch/case by 
replacing the constant list by an enum,
  something like the code below. In that case, creating a CollSer for a Map 
will be done like this,
    return new CollSer(CollSer.Kind.MAP, array);

I'll reply downthread after your exchange with Stephen Colebourne.

s'marks

Reply via email to