オブジェクト「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 オブジェクト インスタンスに属しているかどうかを判断する必要があります。
助けてくれてどうもありがとう!