我正在使用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;
}
但是,你必须检查这种新行为是否没有任何副作用