property

Java 오브젝트의 특성을 확보합니다.

property 표현식은 호출할 Java 메소드의 이름을 지정합니다.

property 표현식을 사용하면 CER이 임의의 메소드 서브세트를 CER 표현식으로 복제할 필요없이 Java 클래스의 기능을 활용할 수 있습니다. 예를 들어, java.util.List에는 size 메소드가 포함되어 있으므로 CER에는 목록에 있는 항목 수를 계수하기 위한 명시적이 표현식이 없습니다.

그러나 CER의 불변 원칙을 준수하기 위해 오브젝트의 "값"을 변경하지 않는 Java 메소드만 호출할 수 있습니다. 메소드가 오브젝트의 클래스(또는 해당 상위 클래스나 인터페이스 중 하나)에 대한 메소드의 "안전 목록"에 포함된 경우 CER에서는 "property" 메소드만 호출할 수 있습니다.

메소드가 안전 목록에 명시적으로 표시된 경우 안전한 것으로 간주됩니다. 안전 목록에 표시되지 않은 경우 CER 규칙 세트 유효성 검증기가 오류를 발행합니다.

팁: 안전을 false로 명시적으로 설정할 필요는 없지만 문서가 완전하게 되도록 포함시킬 수 있습니다. CER에 포함된 안전 목록도 이 경우에 해당합니다.

클래스의 안전 목록은 클래스와 동일한 패키지에 있는 특성 파일로서 이름은 <classname>_CREOLE.properties로 지정됩니다.

CER에는 다음 Java 클래스와 인터페이스의 안전 목록이 포함되어 있습니다.

그림 1. java.lang.Object 메소드의 안전 목록
# java.lang.Object의 안전 목록

# 안전
toString.safe=true

# <equals>를 사용하여 강제로 등식 평가
equals.safe=false

# "안전"해도 노출하지 않음
hashCode.safe=false
getClass.safe=false
그림 2. java.lang.Number 메소드의 안전 목록
# java.lang.Number의 안전 목록

byteValue.safe=true
doubleValue.safe=true
floatValue.safe=true
intValue.safe=true
longValue.safe=true
shortValue.safe=true
그림 3. java.util.List 메소드의 안전 목록
# 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


# 노출되지 않음
hashCode.safe=false
listIterator.safe=false
iterator.safe=false
toArray.safe=false

# 뮤테이터(mutator) - 안전하지 않음
add.safe=false
addAll.safe=false
clear.safe=false
remove.safe=false
removeAll.safe=false
retainAll.safe=false

List Java 인터페이스의 몇 가지 유용한 특성에 대한 설명은 유용한 목록 조작의 내용을 참조하십시오.

<?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>

    <!-- 이 개인에게 자녀가 있는지 여부입니다.

         목록의 isEmpty 특성을 테스트합니다. -->
    <Attribute name="hasChildren">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <not>
          <property name="isEmpty">
            <object>
              <reference attribute="children"/>
            </object>
          </property>
        </not>

      </derivation>
    </Attribute>

    <!-- 이 개인의 자녀 중 첫 번째 자녀를 제외한 모든 자녀입니다.

         다음과 같이 전달된 List의 subList 특성을 사용합니다.
         - (포함) "1" 위치의 항목에서(목록의 두 번째
 구성원을
           표시합니다. Java의 목록은 0 기반입니다.)
         - (제외) "목록 크기" 위치의 항목으로(목록의 마지막 항목
           다음에 있는 위치를 표시함).
    -->
    <Attribute name="secondAndSubsequentChildren">
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <property name="subList">
          <object>
            <reference attribute="children"/>
          </object>
          <arguments>
            <!-- 숫자는 정수로 변환해야 합니다.
                 (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>
경고:
Cúram V6부터 CER과 종속성 관리자에서는 종속성이 변경되는 경우 속성 값을 자동으로 다시 계산하며 데이터베이스에 계산된 속성 값을 저장할 수 있습니다.

특성 메소드의 구현을 변경하면 CER 및 종속성 관리자가 이전 버전의 특성 메소드를 사용하여 계산된 속성 값을 다시 계산해야 한다는 사실을 자동으로 알지 못합니다.

프로덕션 환경에서 저장된 속성 값에 대해 특성 메소드를 사용한 경우 구현을 변경하는 대신 새 특성 메소드(필요한 새 구현을 포함)를 작성한 다음 규칙 세트가 새 특성 메소드를 사용하도록 변경해야 합니다. 새 특성 메소드를 가리키도록 규칙 세트 변경사항을 공개하면 CER이 영향받는 속성 값의 모든 인스턴스를 자동으로 다시 계산합니다.