[jdom-interest] More changes
Patrick Dowler
Patrick.Dowler at nrc.ca
Wed Jul 19 10:12:42 PDT 2000
On Wed, 19 Jul 2000, Brett McLaughlin wrote:
> OK folks... some more food for thought:
>
> * Anyone having a problem with removing getCharContent() (both default
> and non-default version) in Element.java? It doesn't really behave the
> same as the rest...
>
> * What do people think about removing the convenience methods (like
> getIntContent()) on Element.java? Mark Diekhans pointed out that getting
> a default value from an attribute is quite different from getting one
> from an Element - typically, it means the Element is optional, or not
> there, but we also return the default if the /format/ is incorrect. For
> example:
>
> <port>yl7</port>
>
> getPort(80);
These methods could go as they are just as already there in the
java.lang type-wrapper classes:
try
{
int i = Integer.parseInt( element.getContent() );
// do somehthing
}
catch (NumberFormatException ex)
{
// handle format error
}
You really do want an error condition (here and exception) for a
formatting error in the content.
> List kids = element.getChildren();
>
> Do you expect the list to be live? For example, if you add kids to an
> element in the list, of course it works normally. However, if you add or
> remove children from the list, do you expect those to automatically
> cause removal of the children in the List? Or do you not expect it to
> take place (the removal or addition) until you do
> element.setChildren(kids); and reset the list with the modified one?
> This is a key point I would like to get feedback on, and decide if what
> we are doing is right. If not, we can remove PartialList, and really
> simplify things. Additonally, it makes traversal much less
> object-intensive.
Some relevent bits of java.util:
List.subList
- returns a "view" which is backed by the whole list
- allows all the whole list operations to be performed as
range operations
- supports all operations permitted on the backing list
Map.entrySet (keySet, values)
- returns a "view" which is backed by the map
- supports removing
- does NOT support adding!! -- seems strange?
If we take the style of the Collections API as the "java style" then a view
approach seems valid. But - we still have to decide if an Element is a
List (of children) or a Map (since Elements are name/value pairs, although we
certainly allow duplicates, so a strict Map isn't correct). The current use is
to think of them as Lists... I think that means keeping PartialList and
backing it with the child list.
***
An alternative plan might be to implement "iterator" access to the underlying
list instead of a view-based access. I recently wrote a FilteringIterator
base class that can easily be access a subset of a collection. It basically
skips over the elements that don't meet some condition. Subclasses
implement a boolean method. It turns out to be a very efficient way to
look at parts of a list. For example, I had one that only returned Strings
that contain a specific substring. Another implementation only returns
objects which are instances of a specified Class. It wouldn't be too hard to
extend it to be a full ListIterator (previous) and support removal as well.
I'd be happy to contribute it if you like.
As for the effect on Element, these filtering iterators wrap a normal
Iterator (or ListIterator) so Element would just need one (two) methods:
public ListIterator children() { }
public ListIterator attributes() { } // probably useless
Then usage would be something like:
// get all Element children
ListIterator iter = new TypeIterator( el.children(), Element.class );
// get all children named "foo"
ListIterator iter = new NameIterator( el.children(), "foo" );
The down-side (which will certainly be expressed :-) is that some people prefer
indexed access over iterators. Our use of LinkedList inside seems to
suggest that is a bad plan, but still...
Returning a "view" List still lets people use iterators, but possibly with one
extra wrapper level.
--
Patrick Dowler
Canadian Astronomy Data Centre
More information about the jdom-interest
mailing list