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
Odpowiedz
Kolekcje Dżakarta (http://commons.apache.org/collections/apidocs/) umożliwiają stosowanie predykatów, funktorów itp. Na elementach kolekcji. Czy to jest kierunek, którego szukasz?
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ę.
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
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).
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
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 –
- 1. Język zapytań drzewa dla drzew obiektów w pamięci?
- 2. Język potrójnych obiektów MarkLogic
- 3. Literały obiektów w Javie
- 4. Obliczanie użycia pamięci drzewa B w Javie
- 5. Tworzenie tablicy obiektów w Javie
- 6. Budowanie drzewa przy użyciu listy obiektów
- 7. Konwertowanie listy obiektów na listę obiektów opcjonalnych w Javie
- 8. Proste sprawdzanie poprawności obiektów w Javie
- 9. Jak zadeklarować tablicę obiektów w Javie?
- 10. Jak zidentyfikować typy obiektów w Javie
- 11. Tworzenie drzewa binarnego w Javie do celów programowania genetycznego
- 12. Implementacja drzewa w Javie (root, rodzice i dzieci)
- 13. Istniejąca implementacja drzewa Btree lub B + w Javie
- 14. Przejazd przez wszystkich węzłach binarnego drzewa w Javie
- 15. Implementacja java drzewa segmentowego
- 16. Tworzenie obiektów monitora za pomocą ASM w Javie
- 17. używanie nazwy pakietu do tworzenia obiektów w Javie
- 18. Zmiana ikony szuflady nawigacji nawigacji
- 19. Implementacja drzewa binarnego drzewa javascript
- 20. Skompilowany język dynamiczny
- 21. język skryptów w qlikvew
- 22. Język skryptowy PHP lub język programowania?
- 23. Łączenie drzewa wyrażenia .NET w nowy zespół
- 24. Wyświetlanie drzewa w ASCII
- 25. Reprezentacja drzewa w F #
- 26. Kliknij przycisk nawigacji szuflady, nowy widok listy w szufladzie nawigacji
- 27. Czy istnieje szybki język obsługujący przenośne kontynuacje?
- 28. ClassValue w Javie 7
- 29. Wyrażenia lambdy .NET w Javie
- 30. SQL odzyskać strukturę drzewa ładnie
znalazłeś dobre rozwiązanie? – Andez