Obtiene una propiedad de un objeto Java.
La expresión property especifica el nombre del método Java a llamar y:
El objeto Java en el que se debe operar y
Opcionalmente una lista de argumentos a pasar al método Java.
La expresión property permite a CER aprovechar la potencia de las clases Java sin tener que replicar un subconjunto arbitrario de métodos como expresiones CER. Por ejemplo, java.util.List contiene un método size y por lo tanto CER no contiene ninguna expresión explícita para calcular el número de elementos de una lista.
Sin embargo, para satisfacer el principio de inmutabilidad de CER, sólo se puede llamar a los métodos Java que no modifican el "valor" de ningún objeto. CER sólo permite llamar a un método "property" si el método se incluye en la "lista segura" de métodos para la clase del objeto (o uno de las clases o interfaces ancestro).
Se considera que un método es seguro si se ha marcado explícitamente como tal en la lista segura. Si no está presente en la lista seguridad, el validador de conjunto de reglas CER emitirá un error.
La lista segura para una clase es un archivo de propiedades en el mismo paquete que la clase, denominado <nombre_clase>_CREOLE.properties.
CER incluye listas seguras para las siguientes clases e interfaces Java:
# Lista segura para java.lang.Object # seguro toString.safe=true # forzar que se evalúe la igualdad utilizando <equals> equals.safe=false # no se exponen, aunque son "seguros" hashCode.safe=false getClass.safe=false
# Lista segura para java.lang.Number byteValue.safe=true doubleValue.safe=true floatValue.safe=true intValue.safe=true longValue.safe=true shortValue.safe=true
# Lista segura para java.util.List contains.safe=true containsAll.safe=true get.safe=true indexOf.safe=true isEmpty.safe=true lastIndexOf.safe=true size.safe=true subList.safe=true # no expuesto hashCode.safe=false listIterator.safe=false iterator.safe=false toArray.safe=false # mutadores - no seguro add.safe=false addAll.safe=false clear.safe=false remove.safe=false removeAll.safe=false retainAll.safe=false
Para obtener una descripción de algunas de las propiedades útiles en la interfaz Java List, consulte Operaciones de lista útiles.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_property" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <Attribute name="children"> <type> <javaclass name="List"> <ruleclass name="Person"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Indica si esta persona tiene hijos. Prueba la propiedad isEmpty de lista. --> <Attribute name="hasChildren"> <type> <javaclass name="Boolean"/> </type> <derivation> <not> <property name="isEmpty"> <object> <reference attribute="children"/> </object> </property> </not> </derivation> </Attribute> <!-- Todos los hijos de esta persona, excluyendo el primer hijo. Utiliza la propiedad subList de lista, pasando: - (inclusive) del elemento en la posición "1" (que indica el segundo miembro de la lista; las listas en Java están basadas en cero) - (exclusive) al elemento en la posición "tamaño de la lista" (que indica la posición posterior al último elemento de la lista) --> <Attribute name="secondAndSubsequentChildren"> <type> <javaclass name="List"> <ruleclass name="Person"/> </javaclass> </type> <derivation> <property name="subList"> <object> <reference attribute="children"/> </object> <arguments> <!-- El número se debe convertir en un entero (como lo requiere List.subList). --> <property name="intValue"> <object> <Number value="1"/> </object> </property> <property name="size"> <object> <reference attribute="children"/> </object> </property> </arguments> </property> </derivation> </Attribute> </Class> </RuleSet>
Si cambia la implementación de un método de propiedad, CER y el Gestor de dependencias no sabrán recalcular automáticamente los valores de atributo que se han calculado utilizando la versión antigua del método de propiedad.
Una vez que se ha utilizado un método de propiedad en un entorno de producción para valores de atributo almacenados, en lugar de cambiar la implementación deberá crear un nuevo método de propiedad (con la nueva implementación necesaria) y cambiar los conjuntos de reglas para utilizar el nuevo método de propiedad. Cuando publique los cambios de conjunto de regla para que apunten al nuevo método de propiedad, CER recalculará automáticamente todas las instancias de los valores de atributo afectados.