今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

循環参照

とあるクラスを修正したときに、新たな依存関係を作った。それが原因で循環参照になってしまった。ふつうは循環参照があってもビルドできるんだけど、ORB(RMI・CORBA・HORB)を使っていると、そいつらが自動生成するクラスの関係でビルドできなくなったりする。そ、まさに今、ビルドできないのよ。(涙)

public class Hoge {
    :
    private Root root;
    :
    public String geTheAttribute() {
        return root.getTheAttribute();
    }
}

Hogeは今までまったく依存がなかったけど、今回の変更で Root に依存した。つまり今までは Hoge 単独でコンパイルできたのが、Root と Root が依存しているすべてのクラスをコンパイルしないとコンパイルできなくなってしまった。
で、今回はたまたま属性を参照しているだけだった。

public class Hoge {
    :
    private Root root;
    private String attribute;
    :
    public String getSomeAttribute() {
        return root.getSomeAttribute();
    }
}

public class Root {
    :
    private String someAttribute;
    :
    public String getSomeAttribute() {
        return someAttribute;
    }
}

んなわけで、強引に依存を断ち切る。(Hogeインスタンスは分散オブジェクト環境(HORB)によりデフォルトコンストラクタで自動生成されるので static の属性は変更されることはない。)

public class Hoge {
    private static String someAttribute;

    public Hoge() {
    }
    public Hoge(String attribute) {
        someAttribute = attribute;
    }
    :
    public String getSomeAttribute() {
        return someAttribute;
    }
    :
}

で、

public class Root {
    public Root() {
        init();
    }

    private void init() {
        someAttribute = getSomeAttribute();
        new Hoge(someAttribute);
    }
}

とかして、属性を Hoge に強引に渡しておく。
分散オブジェクトの制約ってつらいのよ。
でもYAGNI的にはこれでいいに違いない!
すごく簡単に書いたけど、これじゃ情報が少ないよねぇ。。。詳しくはRMIとかHORBに関連したドキュメントを読もう!(って、やっぱり情報少ないんだけど)