2009-06-12 3 views
2

다음과 같이 EMF를 사용하고 있습니다.EMF Unmodifiable list를 반환하는 메서드 생성

/** 
* Adds the given type to this filter. Has no effect if the given type 
* already belongs to this filter. 
* 
* @param type 
*   the type to add 
* @model 
*/ 
public void addEntityType(String type); 

/** 
* Returns the list of types belonging to this filter. Types are identified 
* by there name. 
* 
* @return the list of types for this entity type filter 
* 
* @model 
*/ 
public List<String> getEntityTypes(); 

/** 
* Removes the given type from this filter. Has no effect if the given type 
* doesn't belong to this filter. 
* 
* @param type 
*   the type to remove 
* @model 
*/ 
public void removeEntityType(String type); 

이 주석이 달린 인터페이스에서 ecore 및 genmodel 파일을 만든 후 코드 생성 후 getEntityTypes 메소드가 다음과 같이 수정되었습니다. 목적이 EList를 수정할 수 없기를 바란다. 따라서 인터페이스 클라이언트의 코드는 add 및 remove 메소드를 통해서만 목록을 수정할 수있다.

수정할 수있는 방법이 있습니까? 즉, Java 주석 또는 genmodel 파일을 수정하여 수정 불가능한 목록을 반환하는 코드를 생성하도록 생성자에게 알려야합니까? (나는 그것을 찾지 못했습니다 ...)

그런 상황을 어떻게 관리합니까?

미리 감사드립니다

마누

답변

4

: 나는 다음과 같은 일을 한

/** 
* <!-- begin-user-doc --> 
* <!-- end-user-doc --> 
* @generated 
*/ 
private EList<String> getEntityTypesGen() { 
    if (entityTypes == null) { 
     entityTypes = new EDataTypeUniqueEList<String>(String.class, 
      this, NsPackage.THINGY__ENTITY_TYPES); 
    } 
    return entityTypes; 
} 

public EList<String> getEntityTypes() { 
    return ECollections.unmodifiableEList(getEntityTypesGen()); 
} 

/** 
* <!-- begin-user-doc --> 
* <!-- end-user-doc --> 
* @generated NOT 
*/ 
public void addEntityType(String type) { 
    getEntityTypesGen().add(type); 
} 

/** 
* <!-- begin-user-doc --> 
* <!-- end-user-doc --> 
* @generated NOT 
*/ 
public void removeEntityType(String type) { 
    getEntityTypesGen().remove(type); 
} 

참고 :

  1. 생성 된 getEntityTypes 메소드의 이름과 가시성을 getEntityTypesGen 및 private, respect로 변경했습니다. ively. EMF는이 메서드를 다시 생성 할 때 가시성을 엉망으로 만들지 않습니다. 또한 EMF는 아직 생성되지 않은 getEntityTypes 메소드가 있더라도이 "Gen"접미어 메소드를 계속 생성합니다.
  2. 기본 구현의 결과를 수정할 수없는 EList에 래핑하는 public, 생성되지 않은 getEntityTypes 메소드를 추가했습니다.
  3. 생성 된 getEntityTypesGen 메소드 (결과는 여전히 수정할 수 있음)에 위임하여 add/removeEntityType 메소드를 구현 (및 생성되지 않음으로 변경)합니다.

개인적으로는이 방법을 권장하지 않습니다. EMF는 일반적으로 항목을 추가하거나 제거하기 위해 클라이언트가 수정해야하는 다중 값 참조에 대해 수정 가능한 목록을 반환합니다. EMF는 필요에 따라 빈 목록을 게으르게 생성하므로 클리너 인터페이스 (메소드 추가/제거가 필요 없음)와 멋진 API (사용자가 추가/제거하는 대신 손끝에서 목록 API의 모든 기능을 사용할 수 있습니다. 당신이 제공하는).