On 26/04/2013 9:52 PM, Paul Sandoz wrote:

On Apr 24, 2013, at 7:57 PM, Remi Forax <fo...@univ-mlv.fr> wrote:

On 04/24/2013 07:24 PM, Akhil Arora wrote:
On 04/24/2013 06:19 AM, Alan Bateman wrote:
On 23/04/2013 20:18, Akhil Arora wrote:
On 04/22/2013 11:42 AM, Alan Bateman wrote:
One thing I meant to ask when forEachRemaining was added was whether it
should say anything about the "last element"? I see in the webrev that
you've set it for the ArrayList iterators but not the LinkedList
iterator - should it?

done, and added more tests for the state of the iterator after
forEachRemaining returns

http://cr.openjdk.java.net/~akhil/8005051.2/webrev/

(a portion of version 1 of the webrev has already been pushed to TL as
part of rev 6973 http://hg.openjdk.java.net/jdk8/tl/jdk/rev/98a7bb7baa76)
The remaining changes in the webrev looks okay to me. Also good to have
the test expanded.

So do you think that the javadoc should say anything about the
relationship between forEachRemaining and remove?

Good question. forEachRemaining docs state -

Implementation Requirements:

    The default implementation behaves as if:

    while (hasNext())
             action.accept(next());

so a subsequent remove() should remove the last element.

To avoid blocking the feature, I have filed
https://jbs.oracle.com/bugs/browse/JDK-8013150 to refine the behavior of remove 
and other ListIterator methods after forEachRemaining returns.

I think the fact that the last element can be removed should be specified as 
unspecified,
because it's more an artefact of the default implementation than something 
which part
of the semantics.


I was wondering about that too. What happens if an implementing class decides 
later on to override the default implementation? If the overriding 
implementation does not conform to the same behaviour as the default it could 
break compatibility.

Plus one could change code from:

   while(it.hasNext() { doSomething(it.next()); }
   doSomethingAtEnd(it);

to

   it.forEachRemaining(this::doSomething}
   doSomethingAtEnd(it);

All implementations must obey the contract of the specification, and no clients should assume any kind of behaviour beyond what that contract says.

That said I've lost the context of this particular issue - what is the problem here?

David

Paul.

Reply via email to