10

你知道一个好的java对象图访问者库吗?

我想访问一个对象及其子组件,并在某些条件匹配时执行一些操作。

示例用法:

  • 在一个巨大的域对象图上,将每个 id 重置为null
  • 在一个巨大的域对象图上,Set用一个TreeSet 包含相同元素的实例替换每个对象。

我想要一个库,而不是自定义代码,因为遍历对象图可能很棘手。您必须处理集合、数组、代理等...我曾考虑重用 XStream 的一部分来实现这一点,但看起来并不那么容易:Xstream 访问者更面向对象转换而不是对象自我修改。

4

5 回答 5

2

碰巧,我做过这样的事情。不是真正的图书馆,但它可以很容易地成长为一个图书馆。

但我偶然发现了这一点,因为我正在寻找更好的东西。我不能把它说出来,而且它肯定还没有处于我会这样做的状态,但也许这样的事情应该像操作系统一样存在?

我所拥有的让我可以逐个实例地遍历和修改对象图类型安全的对象图,可选择复制它以使原始对象保持不变。Java 顺便说一句。也有点作用的是掌握图中的关系(如果需要,边缘)。

我可以设想的是对操作(例如修改、扩展、复制、折叠、遍历)和相应实现的明确定义。诸如识别子图之类的正交方面将被适当地分解。

任何对这样的项目感兴趣的人请回复,也许我们可以开始做点什么。

于 2010-12-15T16:02:04.630 回答
2

我一直在寻找同样的东西,并找到了这个。

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

于 2011-08-18T13:10:12.937 回答
1

为什么你需要一个图书馆才能做到这一点?

既然您指定这是一个域对象图,那么为什么不定义和实现相关接口以允许不同的访问者实现访问您的域对象呢?其中一种实现可以(如您指定)将每个 ID 重置为null.

例子

首先定义可以访问或充当访问者的对象要实现的接口。

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

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

现在定义两个域对象类,它们都可以被访问。

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 回答
1

可能值得尝试像Neo4jTitanDB这样的图形数据库。它将让您通过使用查询来横切您的数据集并探索关系来影响访问。

两者都具有广泛的 Java API 以方便数据加载和查询。

于 2010-07-29T12:11:35.557 回答