Cedric writes why chaining construtors is bad. Actually, what he advocates is concentrating all the construction logic in a single method (e.g., init), and turning constructors into forwarders to this privileged method.
But he does not mention that this is no different from having a single privileged constructor and chaining all other constructors to that. Hence:
class ChooChoo {
public static final Station DEFAULT_STATION = new Station();
public static final Conductor DEFAULT_CONDUCTOR = new Conductor();
private final Station home;
private final Conductor chief;
public ChooChoo() {
this(DEFAULT_STATION, DEFAULT_CONDUCTOR);
}
public ChooChoo(final Station home) {
this(home, DEFAULT_CONDUCTOR);
}
public ChooChoo(final Conductor chief) {
this(DEFAULT_STATION, chief);
}
public ChooChoo(final Station home, final Conductor chief) {
this.home = home;
this.chief = chief;
}
} In my code, init is a privileged constructor (sometimes a private one) which I find more clear. But Cedric mentions that init increases clarity for him. We should pair together. :-)
2 comments:
My only objection to this style, which I explained in my weblog, is that if I browse your code, it's harder for me to find what your canonical constructor is, whereas a constant name such as init() makes it obvious.
Steve, I agree with Cedric's goal of clarity, but I commented on his article that I can achieve clarity by placing the single privileged constructor first and all the others following (reverse of the order presented in my example). Giving the constructor a special name like "init" doesn't seem particularly clarifying to me, but I recognize that this point is one more of taste than a technical one.
Post a Comment