コンストラクタを愛せよ

 もうみてらんない! っていうソースに出会ったので意気消沈。

public class abstract AbstractFooBar implements Bar {
    String id;
    String name;
    boolean autoHoge;
    ...
    public AbstractFooBar(int key) {
        this(false,key);
    }
    public AbstractFooBar(boolean autoHoge, int key) {
        switch(key) {
            case HOGE_KEY:
                this.id = "hoge";
                this.name = "hoge";
                break;
                ...
        }
    }
    public AbstractFooBar(boolean autoHoge, String id) {
        if( id.contains("hoge") {
            this.name = "hoge";
        } else if( ... ) {

        }
    }
}

// 呼び出しているところ
if( id.contains("bar") ) {
    return new AbstractFooBarImpl(BAR_KEY);
} else if( id.contains("foo") ) {
    return new AbstractFooBarImpl(FOO_KEY);
} else if( id.contains("hoge") ) {
    return new AbstractFooBarImpl(HOGE_KEY);
} else if( ... ) {
    ...
}

 ぱっとみ、keyを与えられたらkeyからidを探して代入。
 idを与えられたらnameを代入ってなってるんだけど……。
 これを呼び出しているソースがひどい。
 idを知っていて、そのidからkeyを求めてコンストラクタを呼び出している。
 で、また中でkeyからidを呼び出す。keyは保持しない。
 id知ってるんだからid渡せよ!
 key使わないんならkeyからid求めるなよ!
 とか、(ぼかしてあるので微妙ですが)ツッコミは色々あれど、
 コンストラクタでごにょごにょしすぎじゃない?(意味ないじゃない?)
 みたいな感じがして泣けてくる。
 しかもこのclass、既存のクラスのコピペで99%(コンストラクタ以外)同じクラスが現存するし。(なのに継承してない)

 適切なコンストラクタを定義するってそんなに難しいことかなぁ。
 なんかつらい気持ちになってきた。
 「コンストラクタを大事に」