[jdom-interest] Ideas for API changes

Tom Bradford bradford at dbxmlgroup.com
Sun Apr 29 15:52:20 PDT 2001


Jason Hunter wrote:
> 
> > I'm not sure there needs to be more than that. I think having the
> > common type alone because it really strengthens type checking
> > throughout the API and makes a lot of code simpler. For instance, in
> > addContent() we no longer need to check for seven different types at
> > runtime before adding the object. All the checks can be performed at
> > compile time. I don't know that this would be significantly faster,
> > but it would be conceptually much simpler.
> 
> Node does not take care of this issue!  You removed from your message my
> discussion of the problem.  Having node *weakens* type checking.
> 
> If Element had an addContent(Node) and Document implemented Node then an
> Element could add a Document.  Similarly, if Document has an
> addContent(Node) then Document could add more than one element, Document
> could add Entity objects which don't belong at the Document level.
> Heck, Documents could add Documents.
> 
> So that means with everything accepting Node is we'd still have to do
> lots of runtime checks because not all Nodes are created equal.  I
> prefer having the compiler do the checks.  Better to catch errors at
> compile time than runtime.  Plus it makes clear to people that Document
> only accepts certain types of objects, Element only accepts certain
> types, etc.
> 
> Also, taking a Node interface parameter isn't really safer than taking
> Object because I could still write MyStupidClass implements Node (but
> nothing else) and have it added to any Element even though it's not
> related to XML.  How would you catch that?  By doing exhaustive runtime
> checking within the method?  By just letting this mysterious object be
> added?

Why not add marker interfaces to Node addition... Example:

public interface ElementChild {}
public interface DocumentChild {}

public class Text extends Node implements ElementChild ... {

public class Element extends Node implements ElementChild, DocumentChild
... {
   public void addChild(ElementChild child);
}

Then your addChild method for specific container types (Element,
Document, etc...) can take classes that implement their particular
marker interfaces and chain off to a protected super.addChild method. 
You get compile-time type checking and code reuse.

-- 
Tom Bradford --- The dbXML Project --- http://www.dbxml.org/
We store your XML data a hell of a lot better than /dev/null



More information about the jdom-interest mailing list