我正在使用EMF来建模许多不同种类的对象,现在我想遍历任何种类的对象的EList,并想知道此EList是否包含对所有感兴趣的字段具有相同值的对象我(在equals方法中定义)。问题是我想使用为我的对象重载的equals方法,而不是==-Operator,它仅在是同一对象时才返回true,但是在我的情况下,我创建了一个新对象,设置了字段,现在想知道此对象是否具有相同的字段已在列表中。
我还没有弄清楚EMF中是否有任何设置可以更改ELIst的行为,但是目前我发现了以下代码,似乎每次使用该方法时,它仅将对象与=进行比较。 = -Operator,因为EObjectList重载了useEquals方法,该方法始终返回false。

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的行为,或者是否必须编写自己的实用程序类来执行匹配?

最佳答案

如果还不算太晚,这是我使用简单的OO技巧(供参考)的提示:

当您使用诸如以下方法的吸气剂时:

yourObject.getYourReference();


您将拥有类似以下的东西:

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


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

10-06 12:37