Dieser Ausdruck ruft die Eigenschaft eines Java-Objekts ab.
Der Ausdruck property gibt den Namen der aufzurufenden Java-Methode sowie Folgendes an:
Das Java-Objekt, für das die Operation ausgeführt werden soll.
Optional eine Liste von Argumenten, die an die Java-Methode übergeben werden sollen.
Der Ausdruck property ermöglicht CER die Nutzung von leistungsstarken Java-Klassen, ohne ein beliebiges Subset von Methoden als CER-Ausdrücke replizieren zu müssen. Beispielsweise enthält java.util.List eine Methode size, weshalb CER keinen expliziten Ausdruck besitzt, um die Anzahl von Einträgen in einer Liste zu berechnen.
Um das CER-Prinzip der Unveränderlichkeit einzuhalten, können jedoch nur Java-Methoden aufgerufen werden, die nicht den Wert eines Objekts ändern. CER lässt den Aufruf einer Methode für Eigenschaften nur dann zu, wenn die Methode in der "Sicherheitsliste" der Methoden für die Klasse des Objekts (bzw. für eine ihrer übergeordneten Klassen oder Schnittstellen) enthalten ist.
Eine Methode gilt als sicher, wenn sie in der Sicherheitsliste explizit als solche gekennzeichnet ist. Ist sie in der Sicherheitsliste nicht vorhanden, gibt der CER-Regelwerkvalidierer einen Fehler aus.
Die Sicherheitsliste für eine Klasse ist eine Eigenschaftendatei, die sich in demselben Paket wie die Klasse befindet und mit <klassenname>_CREOLE.properties benannt ist.
CER enthält Sicherheitslisten für die folgenden Java-Klassen und- Schnittstellen:
# Safe list for java.lang.Object # safe toString.safe=true # force equality to be evaluated using <equals> equals.safe=false # not exposed, even though they're "safe" hashCode.safe=false getClass.safe=false
# Safe list for java.lang.Number byteValue.safe=true doubleValue.safe=true floatValue.safe=true intValue.safe=true longValue.safe=true shortValue.safe=true
# Safe list for 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 # not exposed hashCode.safe=false listIterator.safe=false iterator.safe=false toArray.safe=false # mutators - unsafe add.safe=false addAll.safe=false clear.safe=false remove.safe=false removeAll.safe=false retainAll.safe=false
Beschreibungen für einige nützliche Eigenschaften der Java-Schnittstelle List finden Sie in Nützliche Listenoperationen.
<?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> <!-- Whether this person has any children. Tests the isEmpty property of List. --> <Attribute name="hasChildren"> <type> <javaclass name="Boolean"/> </type> <derivation> <not> <property name="isEmpty"> <object> <reference attribute="children"/> </object> </property> </not> </derivation> </Attribute> <!-- All this person's children, excluding the first child. Uses the subList property of List, passing in: - (inclusive) from item at position "1" (denoting the second member in the list; lists in Java are zero-based) - (exclusive) to item at position "size of list" (denoting the position after the last item in the list) --> <Attribute name="secondAndSubsequentChildren"> <type> <javaclass name="List"> <ruleclass name="Person"/> </javaclass> </type> <derivation> <property name="subList"> <object> <reference attribute="children"/> </object> <arguments> <!-- The number must be converted to an integer (as required by 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>
Wenn Sie die Implementierung der Methode für eine Eigenschaft ändern, wissen CER und der Abhängigkeitsmanager nicht automatisch, dass Attributwerte neu berechnet werden müssen, die unter Verwendung der alten Version der Methode für die Eigenschaft berechnet wurden.
Sobald die Methode für eine Eigenschaft in einer Produktionsumgebung für gespeicherte Attributwerte verwendet wurde, sollten Sie anstelle einer Änderung der Implementierung eine neue Methode für die Eigenschaft erstellen (mit der erforderlichen neuen Implementierung) und Ihre Regelwerke so ändern, dass die neue Methode für die Eigenschaft verwendet wird. Wenn Sie Ihre Regelwerkänderungen, die auf die neue Methode für die Eigenschaft verweisen, veröffentlichen, berechnet CER automatisch alle Instanzen des betroffenen Attributwerts neu.