2

オブジェクト「O」が他のオブジェクト参照の任意のレベルを介してオブジェクト「R」(ルート) によって参照されているかどうかを判断することは可能ですか?

例:

public class Car {
    public Driver driver;
}

public class Driver {
    public License license;
}

public class License {
    public ID id;
}

public class ID {
}

このセットアップでは、参照は「車 -> ドライバー -> ライセンス -> ID」です。

ここで、'Car' (C) のインスタンスと 'ID' (I) のインスタンスがある場合、C によって参照されているかどうかを判断したいと思います (直接ではなく、他の参照の任意のレベルを介して)。

1 つの解決策は、リフレクションを再帰的に使用し、検索ルートが「車」であるインスタンス「ID」を「検索」することです。アルゴリズムが「車」から始まり、「参照ツリーをたどり」、「ID」インスタンスが見つかった場合、それは「ID」が「車」によって間接的に参照されていることを意味します。(オブジェクト階層にアクセスする、XML シリアライザーのような再帰的アルゴリズムです)。

このソリューションの欠点は、答えを見つけるのにかなり時間がかかることです。最悪の場合、オブジェクト階層全体 ('Car' 以降) にアクセスする必要があるためです (もちろん、オブジェクト ツリーは複雑になる可能性があります)。

私の具体的な質問は次のとおりです。「ID」からルート「Car」まで、親クラスのように、具体的なオブジェクト参照を使用して、逆にすることは可能ですか?

擬似コードは次のようになります。

parent = ID.getParent()
while ( parent != Car ) {
    parent = parent.getParent()
    if ( parent == null )
        break;
}

(疑似コードは、親クラスではなく、オブジェクトと参照に対して機能することに注意してください)。

クラスメンバー参照が手動で設定されていない場合、Java Reflection がこれを実行できるかどうか、またはそのような child->parent 参照情報がないかどうかはわかりません。

私の目標は次のとおりです。

多くのクラスを持つ複雑なドメイン モデルを持っている。それらのクラスのどこかに 1 つのクラス プロパティが書き込まれた場合 (「car.setDriver(...)」など)、そのドメイン モデル全体をシリアル化する必要があります (「ドキュメントを保存する」)。プロパティの変更を検出するには (私のコンテキストでは AOP を使用できないことに注意してください)、ドメイン クラスのセッター メソッドで独自の PropertyChangeSupport を使用し、PropertyChangeEvents を EventBus にプッシュします。これで、変更を検出し、それに応じてドメイン モデルを保存できるようになりました。

1 つの問題が残っています。プロパティの変更が、ルート オブジェクト (ドメイン モデルのルート オブジェクト) によって参照される cartain オブジェクト インスタンスに属しているかどうかを判断する必要があります。

助けてくれてどうもありがとう!

4

0 に答える 0