Patch used to extend array iterators in general, thanks. Take a look - we
now have:

ArrayIterator
ArrayListIterator
ObjectArrayIterator
ObjectArrayListIterator

The first two support primitives, but with a performance penalty. The latter
two don't, so run faster. Comments welcome.

Stephen

----- Original Message -----
> > Would it be possible for you to refactor to remove
> > UnmodifiableArrayListIterator? Thanks ;-)
>
> No prob. Please find attached updated patches & files as per your
> suggestion. The comments for each file are as per the previous message
> except:
>
> - ArrayIterator.patch : changes as before, except that the "length"
> field has been renamed to "endIndex", which is a far better reflection
> of what the field does. This cannot break any code as the field was
> private up to this point.
>
> - ArrayListIterator.java : now directly extends ArrayIterator.
>
>
> > IteratorUtils now has an unmodifiableListIterator(Iterator) method
> > that wraps iterators to make them unmodifiable. I would prefer to
> > keep this as the only way to make an unmodifiable iterator.
>
> I believe there is actually a strong case for this class, which I'll
> come back to at some point maybe after xmas. But it's gone from the
> hierarchy now.
>
> > Also, I am very uncomfortable with ArrayListIterator being a subclass
> > of UnmodifiableArrayListIterator. There is no 'is a' relationship
> > here, and worse, if I declared a method to take in an
> > UnmodifiableArrayListIterator it would accept a modifiable one which
> > would probably not be what I want.
>
> Again, the UnmodifiableArrayListIterator is gone, so this is a bit
> academic. But for the hell of it ;) Let's suppose we decided that we
> did want to have both an ArrayListIterator and an
> UnmodifiableArrayListIterator. The classes are almost identical, apart
> from the #set method, which is functinal in ArrayListIterator and
> throws an UnsupportedOperationException in UnmodArrayListIterator The
> first thing that popped into my head was to have UnmodArrayListIterator
> extend ArrayListIterator. I was going to submit the classes in that
> state, but as I was reviewing the code, the 'extend' keyword caught my
> eye. UnmodArrayListIterator doesn't really extend the functionality of
> ArrayListIterator, unless one means 'extend' in the sense of 'restrict'
> ;) The UnmodArrayListIterator provides *less* functionality, and it is
> the ArrayListIterator that extends the functionality that
> UnmodArrayListIterator provides.
>
> So, I rearranged the hierarchy, with ArrayListIterator 'extending'
> UnmodArrayListIterator to support the #set operation, and I submitted
> this.
>
> But after your comments, I do see that there is a problem with the
> structure, and it is tied in with the 'is-a' relation, but not in the
> quite so obvious way. It is not always important that the 'is-a'
> relationship holds. This is the case when the parent class is not
> really part of the public interface per se. For instance, ArrayList
> extends AbstractList, but it is not the case that ArrayList 'is-a'
> AbstractList. But this isn't really a problem when the parent class is
> a base implementation that implements an interface type. So, it is ok
> to have hiearchies of which this is an (idealized/edited) example:
>
>      AbstractList ---- implements ---> List
>            |
>       --------------
>       |             |
>   ArrayList    LinkedList
>
> This is ok because the public interfaces use the 'List' type, and the
> existence of the AbstractList is not really of interest to the
> end-user. Now take the case of the ArrayListIterator and the
> UnmodArrayListIterator. It had been my thought that the primary useage
> of these classes would be via static methods in IteratorUtils:
>
>  IteratorUtils.arrayListIterator(array) : ListIterator
>  IteratorUtils.unmodifiableArrayListIterator(array) : ListIterator
>
> Since both of these operations return the interface type
> ('ListIterator'), *initially* it would appear that it doesn't really
> matter to the end-user what the hierarchial relationship (if any)
> between the two classes is. So, the hierarchial relationship is really
> only of 'academic' design interest to the developers of the classes.
> Both of these relationships have problems:
>
>  UnmodifableArrayListIterator
>           ^
>           | // violates 'is-a'
>           |
>   ArrayListIterator
>
> and also:
>
>  ArrayListIterator
>          ^
>          | // violates 'extends' (maybe)
>          |
>  UnmodifableArrayListIterator
>
> I chose the latter design: my reasoning was that it was better to
> violate 'is-a', since the relationship was not being made public
> (because of the use of the static factory methods), and it is generally
> ok to violate 'is-a' in circumstances as per AbstractList just
> discussed. However, as Stephen pointed out (thanks!), this is a bad
> choice, because: > if I declared a method to take in an >
> UnmodifiableArrayListIterator it would accept a modifiable one which >
> would probably not be what I want. So, what to do? This might be design
> overkill, but I think the best structure is probably as per the List
> case:
>
>  AbstractArrayListIterator ---- implements ---> ListIterator
>               |
>         ------------------------
>         |                      |
>  ArrayListIterator   UnmodifiableArrayListIterator
>
> where AbstractArrayListIterator would declare the #set method to be
> abstract. Anyway! I hadn't meant that to be so verbose ;) Do any of you
> hardy souls who've read down this far have any
> thoughts/insight/corrections?
>
> - Neil


----------------------------------------------------------------------------
----


> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to