改变EList(EMF)的行为

时间:2014-10-16 08:53:52

标签: java eclipse-emf emf eclipse-emf-ecore

我使用EMF来模拟很多不同类型的对象,现在我想要浏览任何类型对象的EList,并想知道这个EList是否包含一个对所有字段具有相同值的对象对我来说很感兴趣(在equals方法中定义)。问题是我想使用我为我的对象重载的equals方法,而不是== - 运算符,如果它是同一个对象,它只返回true,但在我的情况下,我创建一个新对象设置字段,现在我想知道具有相同字段的此对象是否已在列表中。 我还没弄明白,如果在EMF中有任何设置我可以改变ELIst的行为但是目前我发现了以下代码,似乎每当我使用该方法包含它时它只比较对象== - 运算符,因为EObjectList重载了始终返回false的useEquals方法。

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;
  }
}

所以我的问题是,如果有人知道我是否可以改变EList的行为,或者我是否必须编写自己的实用程序类来执行匹配?

1 个答案:

答案 0 :(得分:2)

如果还不晚,请使用简单的OO技巧(参考)提示:

使用getter方法时,例如:

yourObject.getYourReference();

您将拥有以下内容:

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

只需覆盖方法useEquals()并标记getter尚未生成:

/**
 * 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;
}

但是,您必须检查这种新行为是否没有任何副作用!