property

Dieser Ausdruck ruft die Eigenschaft eines Java-Objekts ab.

Der Ausdruck property gibt den Namen der aufzurufenden Java-Methode sowie Folgendes an:

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.

Tipp: Das explizite Festlegen der Sicherheit mit false ist unnötig, kann jedoch zur Vollständigkeit der Dokumentation (wie beispielsweise bei den in CER enthaltenen Sicherheitslisten) vorgenommen werden.

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:

Abbildung 1. Sicherheitsliste für Methoden java.lang.Object
# 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
Abbildung 2. Sicherheitsliste für Methoden java.lang.Number
# Safe list for java.lang.Number

byteValue.safe=true
doubleValue.safe=true
floatValue.safe=true
intValue.safe=true
longValue.safe=true
shortValue.safe=true
Abbildung 3. Sicherheitsliste für Methoden java.util.List
# 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>
Vorsicht:
Seit Cúram Version 6 unterstützen CER und der Abhängigkeitsmanager die Speicherung von berechneten Attributwerten in der Datenbank sowie die automatische Neuberechnung von Attributwerte, falls sich ihre Abhängigkeiten ändern.

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.