改变EList(EMF)的行为



我正在使用EMF对许多不同类型的对象进行建模,现在我想浏览任何类型对象的EList,并想知道这个EList是否包含一个对我感兴趣的所有字段都具有相同值的对象(在equals方法中定义)。问题是,我想使用为我的对象重载的equals方法,而不是===-运算符,它只在是同一个对象时返回true,但在我的情况下,我创建了一个新的对象来设置字段,现在我想知道这个具有相同字段的对象是否已经在列表中。我还没有弄清楚EMF中是否有任何设置可以更改ELIst的行为,但目前我发现了以下代码,似乎每次我使用该方法时,它都只将对象与==-运算符进行比较,因为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技巧的提示(供参考):

当您使用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;
}

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

相关内容

  • 没有找到相关文章

最新更新