[jdom-interest] setText() to replace children?

Alex Chaffee guru at stinky.com
Tue Jul 10 08:50:58 PDT 2001

At 6:27 PM -0500 7/9/01, Brett McLaughlin wrote:
 >>One item in the TODO file:
 >>* Consider if setText() should not replace children
 >>I think setText() should set the text of the element, removing any other
 >>text in the element. However, I don't think any other children (such as PIs,
 >>comments, etc) should be affected. Does anyone agree/disagree?

This leaves the behavior ambiguous. Should the existing children be moved to 
the front, or the end?  What happens to whitespace between two comments?

The current behavior is unambiguous. "This sets the content of the element 
to be the text given. All existing text content and non-text context is 
removed." Anyone who wants to preserve existing content can play with their 
own lists (much more intelligently than we can).

Elliotte Rusty Harold wrote:
 > I disagree. It should either replace all content or throw an exception. 
But it shouldn't replace just some part of the content.
 > Actually, here's an idea: suppose we remove setText() completely and 
replace it with this overloaded method:
 > public Element setContent(String text)

This name would be fine with me, since it reinforces that all content will 
be removed.

In fact, it opens the door to a new set of polymorphic methods, just like 
with addContent:

   Element setContent(Comment comment)
   Element setContent(Element element)
   Element setContent(EntityRef entity)
   Element setContent(ProcessingInstruction pi)
   Element setContent(String text)

to go with

  Element setContent(List content)

all of which replace the entire content of the element.

I think that is natural, and will make up for the loss of setText.

Alex Rosen wrote:

> The only problem with all these proposals is the lack of symmetry. If you get
> text by calling getText(), it's natural to set it via setText(), and if that's
> not the name of the method, you have to go looking for it, and figure out if it
> really does what you want it to do. Similarly for setContent() and
> setChildren(). Whether that's a good enough reason to keep the current state of
> things, I don't know. I really like the intuitiveness of setText(), though. In
> the common case where you don't have mixed content, it feels a lot more
> natural.

I think the API lost nomenclature symmetry a long time ago :-) (see any 
thread on "getChildren").

getText() isn't really an accessor though.  There is no property of Element 
called "text."  Rather, it's a utility method that iterates through content 
and concatenates some children while throwing others away.  At best you 
could think of it as a read-only, derived property. Hence there should be no 
setText method, reinforcing that it's a read-only property.

I share Alex's intuition about setText though.  It's just a nice name for 
the method. However, with its other setContent friends it won't be lonely 
with its new name :-)

Alex Chaffee                       mailto:alex at jguru.com
jGuru - Java News and FAQs         http://www.jguru.com/alex/
Creator of Gamelan                 http://www.gamelan.com/
Founder of Purple Technology       http://www.purpletech.com/
Curator of Stinky Art Collective   http://www.stinky.com/

More information about the jdom-interest mailing list