Java 오브젝트의 특성을 확보합니다.
property 표현식은 호출할 Java 메소드의 이름을 지정합니다.
조작할 Java 오브젝트입니다.
선택적으로 Java 메소드에 전달할 인수 목록입니다.
property 표현식을 사용하면 CER이 임의의 메소드 서브세트를 CER 표현식으로 복제할 필요없이 Java 클래스의 기능을 활용할 수 있습니다. 예를 들어, java.util.List에는 size 메소드가 포함되어 있으므로 CER에는 목록에 있는 항목 수를 계수하기 위한 명시적이 표현식이 없습니다.
그러나 CER의 불변 원칙을 준수하기 위해 오브젝트의 "값"을 변경하지 않는 Java 메소드만 호출할 수 있습니다. 메소드가 오브젝트의 클래스(또는 해당 상위 클래스나 인터페이스 중 하나)에 대한 메소드의 "안전 목록"에 포함된 경우 CER에서는 "property" 메소드만 호출할 수 있습니다.
메소드가 안전 목록에 명시적으로 표시된 경우 안전한 것으로 간주됩니다. 안전 목록에 표시되지 않은 경우 CER 규칙 세트 유효성 검증기가 오류를 발행합니다.
클래스의 안전 목록은 클래스와 동일한 패키지에 있는 특성 파일로서 이름은 <classname>_CREOLE.properties로 지정됩니다.
CER에는 다음 Java 클래스와 인터페이스의 안전 목록이 포함되어 있습니다.
# java.lang.Object의 안전 목록 # 안전 toString.safe=true # <equals>를 사용하여 강제로 등식 평가 equals.safe=false # "안전"해도 노출하지 않음 hashCode.safe=false getClass.safe=false
# java.lang.Number의 안전 목록 byteValue.safe=true doubleValue.safe=true floatValue.safe=true intValue.safe=true longValue.safe=true shortValue.safe=true
# 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>
특성 메소드의 구현을 변경하면 CER 및 종속성 관리자가 이전 버전의 특성 메소드를 사용하여 계산된 속성 값을 다시 계산해야 한다는 사실을 자동으로 알지 못합니다.
프로덕션 환경에서 저장된 속성 값에 대해 특성 메소드를 사용한 경우 구현을 변경하는 대신 새 특성 메소드(필요한 새 구현을 포함)를 작성한 다음 규칙 세트가 새 특성 메소드를 사용하도록 변경해야 합니다. 새 특성 메소드를 가리키도록 규칙 세트 변경사항을 공개하면 CER이 영향받는 속성 값의 모든 인스턴스를 자동으로 다시 계산합니다.