On Wed, 18 Nov 2009, Peter Duniho wrote:
Tom Anderson wrote:
[...]
Am i right in thinking that all of these will force loading of Foo?
I think so. But I haven't checked the spec to make sure.
Does anyone have any other idioms? How about any opinions on which
idiom is best, or at least most idiomatic?
I find the question ironic. :) The fact is, you've got some
clearly non-idiomatic scenario, where for some reason your code has
managed to become dependent on the initialization of a class that it
does not in fact refer to in the process of being dependent on it.
Given that violation of a very fundamental assumption one normally
could make in a Java program, asking for an idiomatic solution to
the violation seems sort of silly to me. Your code is already
broken; any work-around is destined to be non-idiomatic. :)
What's really happening is more like this:
class FooMangler implements Mangler {
static {
ManglerRegistry.register("foo", FooMangler.class);
}
}
class ManglingParser extends org.xml.sax.helpers.DefaultHandler {
public void startElement (String uri, String localName, String qName, Attributes attrs) throws SAXException {
String manglerName = attrs.getValue("mangler");
Mangler mangler = ManglerRegistry.lookup(manglerName);
mangler.mangle(qName, attrs);
}
}
The idea is that manglers can take care of registering themselves - as
long as they're loaded. This is an old and fairly well-known pattern
(at least, not wildly obscure - in terms of birds, about as common as
a kingfisher is in England), although i certainly wouldn't say it's a
good one, or even a non-dubious one. 'Broken' is a bit too strong,
although only a bit.
methods. I'd prefer creating an instance of ManglerRegistry,
to it in the ManglingParser. This requires more coding, obviously,
different registries. Also, it allows registering the same mangler
more than once under different names, which can sometimes be useful.