10

優れた Java オブジェクト グラフ ビジター ライブラリを知っていますか?

オブジェクトとそのサブコンポーネントにアクセスし、いくつかの条件が一致したときにいくつかのアクションを実行したいと考えています。

使用例:

  • 巨大なドメイン オブジェクト グラフで、各 ID をnull
  • 巨大なドメイン オブジェクト グラフでは、それぞれSetTreeSet 同じ要素を含むインスタンスに置き換えます。

オブジェクト グラフをトラバースするのは難しいため、カスタム コードではなくライブラリが必要です。コレクション、配列、プロキシなどを処理する必要があります...これを実現するために XStream の一部を再利用することを考えましたが、それほど簡単ではないようです。Xstream ビジターは、オブジェクトの自己変更よりもオブジェクト変換を重視しています。

4

5 に答える 5

2

たまたま、私はそのようなことをしました。実際にはライブラリではありませんが、簡単にライブラリに成長できます。

しかし、もっと良いものを探していたので、これに出くわしました。出すわけにはいかないですし、まだやれる状態ではないのは確かですが、そういうものがOSとして生きてくるのではないでしょうか?

私が持っているものを使用すると、オブジェクト グラフをタイプ セーフに、インスタンスごとにトラバースして変更し、オプションで複製して、元のグラフをそのままにしておくことができます。Javaところで。また、グラフ内の関係 (必要に応じてエッジ) を把握することも少し効果的です。

私が想像できるのは、操作 (変更、拡張、複製、折りたたみ、トラバースなど) とそれぞれの実装の明確な定義です。サブグラフの識別などの直交する側面は、適切に除外されます。

そのようなプロジェクトに興味がある人は、返信してください。何かを始めることができるかもしれません。

于 2010-12-15T16:02:04.630 に答える
2

同じものを探していて、これを見つけました。

http://code.google.com/p/behaim/

于 2011-08-18T13:10:12.937 に答える
1

Neo4jTitanDBのようなグラフデータベースを試す価値があるかもしれません。クエリを使用してデータセットを横断し、関係を調査することで、訪問に影響を与えることができます。

これらは両方とも、データのロードとクエリを容易にするための広範なJavaAPIを備えています。

于 2010-07-29T12:11:35.557 に答える
1

それを行うためになぜライブラリが必要なのですか?

これがドメイン オブジェクト グラフであると指定した場合、関連するインターフェイスを定義および実装して、さまざまなビジター実装がドメイン オブジェクトにアクセスできるようにしてみませんか? 実装の 1 つは (指定したとおり) 各 ID を にリセットできますnull

最初に、アクセスできるオブジェクトまたはビジターとして機能するオブジェクトによって実装されるインターフェイスを定義します。

public interface Visitable {
  void visit(Visitor visitor);
}

public interface Visitor {
  void visitDomainObjectA(DomainObjectA obj);
  void visitDomainObjectB(DomainObjectB obj);
}

次に、2 つのドメイン オブジェクト クラスを定義します。どちらもアクセスできます。

public abstract class DomainObject implements Visitable {
  private Object id;

  public Object getId() { return this.id; }
  public void setId(Object id) { this.id = id; }
}

public class DomainObjectA extends DomainObject {
  public void visit(Visitor visitor) {
    visitor.visitDomainObjectA(this);
  }
}

public class DomainObjectB extends DomainObject {
  public void visit(Visitor visitor) {
    visitor.visitDomainObjectB(this);
  }
}

次に、何か役に立つ具体的な Visitor 実装を定義します。

public class MyVisitor implements Visitor {
  public void visitDomainObjectA(DomainObjectA doa) {
    doa.setId(null);
  }

  public void visitDomainObjectB(DomainObjectB dob) {
    doa.setId(UUID.randomUUID());
  }
}
于 2010-07-29T10:46:47.127 に答える
1

オブジェクト グラフを XML にマーシャリングし、標準の XML 処理/操作ライブラリを使用するのはどうですか?

于 2010-07-29T12:07:37.733 に答える