2010-03-08 13 views
9

W systemie, który obecnie rozwijam, często muszę nawigować po drzewie obiektów i na podstawie jego stanu i wartości podejmować działania. W normalnej Javie powoduje to uciążliwe pętle, czy instrukcje itp. Czy istnieją alternatywne sposoby osiągnięcia nawigacji po drzewie, podobne do XPath dla XML? Wiem, że jest JXPath i OGNL, ale czy znasz jakieś inne biblioteki do tego celu? Czy znasz biblioteki, które generują kody bajtowe dla określonych wyrażeń nawigacyjnych drzewa, aby przetwarzanie było tak szybkie, jak kompilacja Java i ifs?Język nawigacji drzewa obiektów w Javie

+0

znalazłeś dobre rozwiązanie? – Andez

Odpowiedz

2

Czy mogę zapytać, dlaczego nie chcesz OGNL/JXPath? Oczywiście mógłbyś zrobić swoje badania, by powiedzieć "nie", ale chciałbym się dowiedzieć, dlaczego OGNL nie rozwiązuje celu, który został zaprojektowany do rozwiązania.

Również google-collections ma kilka funktorów (oprócz wspomnianych wyżej zbiorów wspólnych), na które warto zwrócić uwagę.

+2

OGNL i JXPath używają odbicia do interpretacji wyrażeń nawigacji na wykresie lub w drzewie. W niektórych sytuacjach jest to ok, ale dla mojego przypadku użycia potrzebuję biblioteki, która generuje bytecodes dla wyrażeń drzewa, aby zrobić je tak szybko, jak normalny kod java. – paweloque

5

Można rozważyć Jakarta Bean Utils

String street = (String) PropertyUtils.getProperty(user, "address.street"); 

można nawigować wykres obiektu przy użyciu notacji dot. Możesz uzyskać dostęp do indeksowanych właściwości. Więcej szczegółów na temat dokumentów.

Jedną wadą jest to, że Bean Utils oczekuje, że nawigowany wykres nie zawiera zerowych odniesień.

Fragment kodu poniżej by rzucić NPE

Person person = new Person(); 
person.setAddress(null); 

String street = (String) PropertyUtils.getProperty(person, "address.street"); 

do pokonania tego ograniczenia mój zespół wdrożył klasy, która tworzy instancje wszystkich zerowych odniesień do wykresu na żądanie. Ten kod jest oparty na refleksyjnych i dynamicznych proxy (CGLIB).

+0

To prawda, ale przy użyciu beanutils nie jest możliwe zdefiniowanie predykatów na węzłach lub wykonanie funkcji na wartościach. – paweloque

+0

Rozumiem, nie uchwyciłem tego wymogu. W takim przypadku przydatna może być sugestia Davida (Zbiorowe zbiory). Ma predykaty API (http://www.discursive.com/books/cjcook/reference/collections-sect-filtering.html), ale może być bardziej szczegółowy niż można by się spodziewać. Możesz także wziąć pod uwagę kolekcje Google (http://code.google.com/p/google-collections/). Podsłuchałem, że implementują również filtrowanie według predykatów –

Powiązane problemy