2010-03-08 15 views
9

En el sistema que estoy desarrollando, a menudo tengo que navegar por un árbol de objetos y, en función de su estado y valores, tomo medidas. En Java normal, esto da como resultado tediosos bucles for, if statements, etc ... ¿Hay formas alternativas de lograr la navegación en árbol, similar a XPath para XML? Sé que hay JXPath y OGNL, pero ¿conoces otras bibliotecas para tal fin? ¿Conoces alguna biblioteca que genere bytecodes para expresiones de navegación de árbol específicas para hacer el procesamiento tan rápido como fors y ifs nativos de Java?Idioma de navegación del árbol de objetos en Java

+0

¿Encontró una buena solución para esto? – Andez

Respuesta

2

¿Puedo preguntarle por qué no le gustaría OGNL/JXPath? Obviamente, puede haber hecho su investigación para decir que no, pero me gustaría saber por qué OGNL no está resolviendo un propósito para el que fue diseñado.

También google-collections tiene algunos functors (además de las colecciones de commons mencionadas anteriormente) que pueden valer la pena mirar.

+2

OGNL y JXPath usan la reflexión para interpretar el gráfico o las expresiones de navegación de árbol. En algunas situaciones, esto está bien, pero para mi caso de uso necesito una biblioteca que genere bytecodes para las expresiones de árbol para que sean tan rápidas como el código Java normal. – paweloque

5

Es posible que desee considerar Jakarta Bean Utils

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

Usted puede navegar a través del gráfico de objetos utilizando una notación de punto. Puede acceder también a propiedades indexadas. Más detalles sobre los documentos.

Una desventaja es que Bean Utils espera que el gráfico que está navegando no contenga referencias nulas.

El siguiente fragmento de código sería lanzar una NPE

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

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

Para superar esta limitación mi equipo implementó una clase que crea instancias de todas las referencias nulas de un gráfico en la demanda. Este código se basa en la reflexión y los proxies dinámicos (CGLIB).

+0

Eso es cierto, pero al usar los beanutils no es posible definir predicados en nodos o ejecutar funciones en valores. – paweloque

+0

Entiendo, no capturé ese requisito. En ese caso, la sugerencia de David (Colecciones comunes) puede ser útil. Tiene una API de predicados (http://www.discursive.com/books/cjcook/reference/collections-sect-filtering.html), pero puede ser más detallado de lo que cabría esperar. También puede considerar Google Collections (http://code.google.com/p/google-collections/). Oí que también implementan filtrado por predicados –

Cuestiones relacionadas