Вы знаете хорошую библиотеку посетителя графа объектов Java?
Я хочу посетить объект и его sub компоненты и выполнить некоторые действия, когда некоторые условия подобраны.
Использование в качестве примера:
null
Set
с a TreeSet
экземпляр, содержащий те же элементы.Я хочу библиотеку, не пользовательский код, потому что пересечение Графа объектов может быть хитрым. Необходимо обработать наборы, массивы, прокси, и так далее... Я имею, думают о части повторного использования XStream для достижения этого, но это не выглядит настолько легким: посетитель Xstream более ориентирован на трансформацию объектов, чем объект сам модификация.
Как насчет преобразования графа объекта в XML и использования какой-нибудь стандартной библиотеки обработки / манипулирования XML?
Возможно, стоит попробовать базу данных графов, например Neo4j или TitanDB . Это позволит вам влиять на посещения, используя запросы, чтобы разрезать набор данных и исследовать взаимосвязи.
Оба они имеют обширные API-интерфейсы Java для облегчения загрузки данных и запросов.
Зачем вам нужна библиотека для этого?
Учитывая, что вы указали, что это граф объекта домена, почему бы не определить и не реализовать соответствующие интерфейсы, чтобы позволить объектам вашей области быть посещали различные реализации посетителя? Одна из реализаций может (как вы указали) сбрасывать каждый идентификатор на 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);
}
}
Теперь определите конкретную реализацию посетителя, которая делает что-нибудь полезное:
public class MyVisitor implements Visitor {
public void visitDomainObjectA(DomainObjectA doa) {
doa.setId(null);
}
public void visitDomainObjectB(DomainObjectB dob) {
doa.setId(UUID.randomUUID());
}
}