Java 클래스

애플리케이션의 classpath에 있는 모든 Java 클래스는 CER 규칙 세트의 데이터 유형으로 사용할 수 있습니다.

경고:
데이터베이스에 규칙 오브젝트를 저장할 때 CER에 등록된 유형 핸들러가 있는 데이터 유형만 사용할 수 있습니다.

CER에는 가장 일반적으로 사용되는 데이터 유형의 유형 핸들러가 포함되어 있습니다.

패키지 이름

Java 클래스의 이름은 다음 패키지의 클래스를 제외한 패키지 이름을 포함하는 완전한 이름이어야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_javaclassDataType"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">
    <Attribute name="isMarried">
      <type>
        <!-- java.lang.Boolean은 패키지를
             지정하지 않아도 됩니다. -->
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="dateOfBirth">
      <type>
        <!-- Cúram 클래스에 대한 완전한 이름 -->
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


  </Class>

</RuleSet>
팁: boolean과 같은 기본 Java 유형은 CER에서 사용할 수 없습니다. 대신 동등한 클래스를 사용하십시오(예: Boolean).

불변 오브젝트

CER의 핵심 원칙은 각 값을 계산한 후에는 변경할 수 없다는 점입니다.

이 원칙을 준수하려면 사용하는 모든 Java 클래스가 불변이어야 합니다.

경고: CER 규칙 세트의 데이터 유형으로 가변 Java 클래스를 사용하는 경우 Java 코드가 해당 Java 클래스의 오브젝트 값을 수정하려고 시도하지 않아야 합니다. 값이 "몰래" 변경되는 중이면 CER이 계산의 신뢰성을 보장할 수 없습니다.

일반적으로 대부분의 데이터 유형 요구사항을 만족시키는 다양한 범위의 불변 클래스가 있습니다. 일반적으로 Java 클래스의 JavaDoc을 참조하여 클래스가 불변인지 판별해야 합니다.

사용자의 요구사항을 충분히 충족시킬 가능성이 매우 큰 몇 가지 유용한 불변 클래스가 다음과 같이 나열되어 있습니다.

상속

CER은 Java 클래스와 인터페이스의 상속 계층 구조를 인식합니다.

CER에서는 상위 Java 클래스나 인터페이스 중 하나에서 필요할 때마다 Java 클래스 값을 리턴할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_javaclassInheritance"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">
    <Attribute name="isMarried">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isMarriedAsObject">
      <type>
        <!-- 예를 들기 위해, 이 값을
             java.lang.Object("실제"
             규칙 세트에서는 유용하지 않음)로
             리턴합니다. -->
        <javaclass name="Object"/>
      </type>
      <derivation>
        <!-- 부울이 오브젝트이므로 정상입니다. -->
        <reference attribute="isMarried"/>
      </derivation>
    </Attribute>

    <Attribute name="isMarriedAsString">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <!-- CER 규칙 세트 유효성 검증기가 아래에 오류를
             보고합니다(부울이 문자열이 아니기 때문).

             ERROR    Person.isMarriedAsString
             Example_javaclassInheritance.xml(28, 41)
             하위 'reference'가 'java.lang.Boolean'을 리턴하지만
             이 항목에는 'java.lang.String'이 필요합니다. -->
        <!-- <reference attribute="isMarried"/> -->

        <!-- (이 예제가 오류없이 빌드되도록 지정된 대로
              선언) -->
        <specified/>

      </derivation>
    </Attribute>

  </Class>

</RuleSet>

매개변수화된 클래스

Java 5에서는 매개변수화된 클래스 지원이 도입되었으며 CER을 사용하여 규칙 세트에서 매개변수화된 Java 클래스를 사용할 수 있습니다.

매개변수화된 클래스의 매개변수가 <javaclass> 선언에 나열됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_javaclassParameterized"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">
    <Attribute name="favoriteWords">
      <type>
        <!-- 문자열 목록 -->
        <javaclass name="List">
          <javaclass name="String"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="luckyNumbers">
      <type>
        <!-- 숫자 목록 -->
        <javaclass name="List">
          <javaclass name="Number"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="children">
      <!-- Person 규칙 오브젝트의 목록입니다.

           java.util.List는 임의의 오브젝트로 매개변수화될 수 있으므로
           규칙 클래스를 매개변수로 사용할 수 있습니다.
      -->
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- 이 사람이 소유한 개입니다. -->
    <Attribute name="dogs">
      <type>
        <javaclass name="List">
          <ruleclass name="Dog"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- 이 사람이 소유한 고양이입니다. -->
    <Attribute name="cats">
      <type>
        <javaclass name="List">
          <ruleclass name="Cat"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- 이 사람이 소유한 모든 애완동물입니다. -->
    <Attribute name="pets">
      <type>
        <javaclass name="List">
          <ruleclass name="Pet"/>
        </javaclass>
      </type>
      <derivation>
        <joinlists>
          <fixedlist>
            <listof>
              <javaclass name="List">
                <ruleclass name="Pet"/>
              </javaclass>
            </listof>
            <members>
              <!-- 모든 개 - 개는 애완동물의 유형입니다. -->
              <reference attribute="dogs"/>
              <!-- 모든 고양이 - 고양이는 애완동물의 유형입니다. -->
              <reference attribute="cats"/>

              <!-- CER에서는 이 표현식에 "children"을
                   사용할 수 없습니다. 아동이 사랑스럽거나
                   가구를 긁어놓을 수는 있지만 이에 상관없이 애완동물은
                   아닙니다. -->
              <!-- 사용할 수 없음 -->
              <!-- <reference attribute="children"/> -->
              <!-- 사용할 수 없음 -->

            </members>
          </fixedlist>

        </joinlists>
      </derivation>
    </Attribute>


  </Class>

  <Class abstract="true" name="Pet">

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Dog" extends="Pet">

    <Attribute name="favoriteTrick">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Cat" extends="Pet">

    <Attribute name="numberOfLives">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- 고양이의 목숨은 9개라는 사실은
             잘 알려져 있습니다. -->
        <Number value="9"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>

CER에서는 java.lang.Object를 허용하는 매개변수에 모든 유형(규칙 오브젝트 포함)을 사용할 수 있습니다. 매개변수(예: 규칙 클래스)가 동적으로 정의되어도 CER이 "명백한 유형 지정"을 강제 시행합니다. CER은 매개변수화된 하나의 클래스를 다른 클래스에 지정할 수 있는지 여부를 결정할 때 규칙 클래스의 상속 계층 구조도 인식합니다.