【问题标题】:Change behaviour of EList (EMF)更改 EList (EMF) 的行为
【发布时间】:2016-01-21 22:25:58
【问题描述】:

我正在使用 EMF 对许多不同类型的对象进行建模,现在我想通过任何类型的对象的 EList 并想知道该 EList 是否包含一个对象,该对象的所有字段的值都相同我感兴趣(在 equals 方法中定义)。问题是我想使用我为我的对象重载的equals方法而不是==-Operator,它只在它是同一个对象时才返回true,但在我的情况下,我创建一个新对象设置字段,现在我想知道这个具有相同字段的对象是否已经在列表中。 我还没有弄清楚 EMF 中是否有任何设置可以更改 ELIst 的行为,但目前我找到了以下代码,似乎每次我使用包含它的方法时,它只会将对象与 = 进行比较=-Operator,因为 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 的行为,或者我是否必须编写自己的实用程序类来执行匹配?

【问题讨论】:

  • 我不认为有办法自定义它(至少,这不是一个非常肮脏的黑客)。请参阅 org.eclipse.emf.ecore.EObject 接口的文档,该接口明确指出:'框架还假设实现不会专门化 equals(Object)(也不会专门化 hashCode()),因此“==”可以是总是用于相等性测试'。
  • 顺便说一下,您可以编写一个辅助方法,它遍历 EList,并使用 org.eclipse.emf.ecore.util.EcoreUtil 将每个元素与给定的 EObject 进行比较#equals 或您为 EObjects 编写的任何比较器。
  • 感谢您的快速回复。是的,这正是我现在要做的,编写一个定义相同方法但使用 equals 方法的实用程序类。

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


【解决方案1】:

如果还不算太晚,这里是我使用简单 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;
}

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

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 2012-08-10
    • 1970-01-01
    • 2010-11-16
    • 2019-08-26
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多