Re: calling own methods from constructor
On 06/04/2011 22:48, Andreas Leitgeb allegedly wrote:
There is well-known danger in calling own methods from the
constructor, namely that the method called may be overridden by a
subclass, which is really instanciated, but whose specific
constructor has not yet been run.
Definitely present.
Is there any *good* use of having the constructor call a method that
actually *can* be overridden in a subclass? I mean, are there
(non-anti)patterns of explicitly allowing subclasses to hook into
base-class's construction?
I've recently written something like this:
class BaseClass implements java.io.Externalizable {
protected Map<?, ?> store;
protected BaseClass( Map<?, ?> store ){
this.store = store;
initialise0();
}
public BaseClass(){ } //needed for Externalizable
protected void initialise0(){}
public void readExternal( ObjectInput input ){
this.store = (Map<?, ?>) input.readObject();
initialise0();
}
}
class SubClass {
private static final Object KEY = ...
String datum;
public SubClass( Map<?, ?> store ){
super( store );
}
protected void initialise0(){
super.initialise0();
datum = (String) store.get( KEY );
}
}
I consider this a valid use. Sure, even at this basic level you need to
be careful, especially if you get back to the code after a while and
start extending the hierarchy.
I could have duplicated the initialisation code in the (Map<?,?>) c'tor.
I'm not very fond of big c'tors however, and even less fond of code
duplication. So there.
As for the fact that you can call virtual methods, I'm all for it, just
as I am against any sensible restriction. We're all adults (probably)
and know what we're doing (mostly), and anyway there's already so many
more places you can screw up if you're not careful (autoboxing comes to
mind) -- I generally pay a lot more attention when I craft a class
hierarchy than when I write a single statement involving primitives and
Objects at the same time.
--
DF.
An escaped convict once said to me:
"Alcatraz is the place to be"