2014-10-16 4 views
1

EMF를 사용하여 다양한 종류의 객체를 모델링했습니다. 이제는 어떤 종류의 객체라도 EList를 통해보고 싶습니다.이 EList에 객체가 포함되어 있는지 알고 싶습니다. 나를 위해 관심있는 모든 필드에 동일한 값 (equals 메서드에서 정의 됨). 문제는 내가 내 객체에 오버로드 된 equals 메서드를 사용하려고하지만 == 연산자가 아니라 동일한 객체 인 경우 true를 반환하는 연산자이지만 내 경우에는 새 객체를 만들고 필드를 설정하면됩니다. 같은 필드를 가지는이 오브젝트가 벌써리스트에 존재할지 어떨지 궁금합니다. EMF에서 ELIst의 동작을 변경할 수있는 설정이 있다면 아직 알지 못했지만 현재 다음 코드를 찾았습니다.이 메서드를 사용할 때마다 개체가 == EObjectList가 항상 false를 반환하는 useEquals 메서드를 오버로드하기 때문에 연산자. 나는 EList 또는 내가 일치를 수행 내 자신의 유틸리티 클래스를 작성해야하는 경우 동작을 변경할 수 있는지 아는 사람 않을 경우 EList (EMF)의 동작 변경

public class BasicEList<E> extends AbstractEList<E> { 
    /** 
    * Returns whether the list contains the object. 
    * This implementation uses either <code>equals</code> or <code>"=="</code> depending on {@link #useEquals useEquals}. 
    * @param object the object in question. 
    * @return whether the list contains the object. 
    * @see #useEquals 
    */ 
    @Override 
    public boolean contains(Object object) 
    { 
    if (useEquals() && object != null) 
    { 
     for (int i = 0; i < size; ++i) 
     { 
     if (object.equals(data[i])) 
     { 
      return true; 
     } 
     } 
    } 
    else 
    { 
     for (int i = 0; i < size; ++i) 
     { 
     if (data[i] == object) 
     { 
      return true; 
     } 
     } 
    } 
    return false; 
    } 
} 

public class EObjectEList<E> extends EcoreEList<E> { 
    --> Output skipped 
    @Override 
    protected boolean useEquals() 
    { 
    return false; 
    } 
} 

그래서 제 질문은? 당신은 같은 getter 메소드를 사용하면

가 :

yourObject.getYourReference(); 

당신은 같은 뒤에해야합니다 너무 늦지 않았습니다 경우

+1

적어도 사용자 정의 할 방법이 없다고 생각합니다 (적어도 더러운 해킹은 아닙니다). 'org.eclipse.emf.ecore.EObject 인터페이스에 대한 설명서를 참조하십시오.'프레임 워크는 구현이 equals (Object) (또는 hashCode())를 전문으로하지 않으므로 "=="이 될 수 있다고 가정합니다. 평등성 테스트에 항상 사용됩니다. ' – execc

+0

그런데 EList에 대해 반복하는 도우미 메서드를 작성하고 요소 인 경우 해당 요소를 지정된 EObject와 비교할 때 org.eclipse.emf.ecore.util.EcoreUtil # equals 또는 비교자를 사용하여 각 요소를 비교할 수 있습니다 당신을 위해 작성된 EObjects. – execc

+0

빠른 응답을 보내 주셔서 감사합니다. 예, 지금 할 일은 똑같은 메서드를 정의하지만 equals 메서드를 대신 사용하는 유틸리티 클래스를 작성하십시오. – tom1991te

답변

2

, 여기 (참조 용) 간단한 OO 트릭을 사용하여 내 힌트 :

public EList<YourReference> getYourReference() { 
    if (reference == null) { 
     reference = new EObjectResolvingEList<YourReference>(YourReference.class, this, 
       YourPackage.YOUR_OBJECT_REFERENCE); 
    } 
    return reference ; 
} 

그냥 방법 useEquals()을 무시하고 표시 게터가 생성되지 않았습니다

/** 
* generated NOT 
*/ 
public EList<YourReference> getYourReference() { 
    if (reference == null) { 
     reference = new EObjectResolvingEList<YourReference>(YourReference.class, this, 
       YourPackage.YOUR_OBJECT_REFERENCE) { 

      @Override 
      protected boolean useEquals() { 
       return true; 
      } 

     }; 
    } 
    return reference; 
} 

그러나이 새로운 동작에 부작용이 없는지 확인해야합니다.