Библиотека посетителей графов объектов Java - PullRequest
10 голосов
/ 29 июля 2010

Знаете ли вы хорошую библиотеку посетителей графов объектов Java?

Я хочу посетить объект и его подкомпоненты и выполнить некоторые действия при совпадении некоторых условий.

Примериспользование:

  • на огромном графе объектных доменов, сбросьте каждый идентификатор на null
  • на огромном графе объектных объектов, замените каждый Set на TreeSet экземпляр, содержащий те же элементы.

Мне нужна библиотека, а не пользовательский код, потому что обход графа объектов может быть сложным.Вы должны работать с коллекциями, массивами, прокси-серверами и так далее ... Я думаю о повторном использовании части XStream для достижения этой цели, но это выглядит не так просто: посетитель Xstream больше ориентирован на преобразование объекта, чем на самодиагностику объекта.

Ответы [ 5 ]

2 голосов
/ 18 августа 2011

Я искал то же самое и нашел это.

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

2 голосов
/ 15 декабря 2010

Как это случилось, я сделал такую ​​вещь.Не совсем библиотека, но она может легко перерасти в одну.

Но я наткнулся на это, поскольку искал что-то лучшее.Я не могу выдать это, и это определенно еще не в состоянии, где я бы это сделал, но, может быть, такая вещь должна появиться в качестве ОС?

То, что у меня есть, позволяет мне проходить и изменятьобъектный граф, безопасный для типов, экземпляр за экземпляром, возможно, дублирующий его так, что оригинал остается нетронутым.Java Кстати.Что еще работает, так это захват связей в графе (по краям, если хотите).

Я мог бы представить четкое определение операций (таких как изменение, расширение, дублирование, свертывание, перемещение).) и соответствующие реализации.Ортогональные аспекты, такие как идентификация подграфов, будут должным образом учтены.

Любой, кто заинтересован в таком проекте, пожалуйста, ответьте, может быть, мы можем что-то начать.

1 голос
/ 29 июля 2010

Как насчет маршалинга вашего графа объектов в XML и использования некоторой стандартной библиотеки обработки / манипуляции XML?

1 голос
/ 29 июля 2010

Возможно, стоит попробовать графическую базу данных, такую ​​как Neo4j или TitanDB .Это позволит вам влиять на посещение, используя запросы для сквозного анализа набора данных и изучения взаимосвязей.

Оба имеют расширенные API-интерфейсы Java для облегчения загрузки и запроса данных.

1 голос
/ 29 июля 2010

Зачем вам нужна библиотека для этого?

Если вы укажете, что это граф объектов домена, тогда почему бы не определить и не реализовать соответствующие интерфейсы, чтобы разрешить доступ к вашим объектам домена другому посетителю?реализации?Одна из реализаций может (как вы указываете) сбросить каждый идентификатор на 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());
  }
}
...