考虑一个 EMF EObject 实例:
EObject eObject = ...
请注意,我无法对
eObject
做出更多假设。
我想添加一个
boolean readyToBeProcessed
标签/注释/属性,除了这个 eObject
之外什么都没有。这意味着 EMF 框架管理的具有相同 .eClass()
的其他对象不应受到任何影响。
这可能吗?
到目前为止我见过的例子:
EAnnotation
并使用 eObject
的 eClass()
EAttribute
并使用 eObject
的 eClass()
但是,这些方法修改了
eClass()
,这在我的情况下是不可接受的。
一种选择是(ab)使用适配器,如下所示。
import java.util.HashMap;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EcoreFactory;
public class Example {
public static void main(String[] args) throws Exception {
// Define an EObject variable and assign it to a random EObject
EObject eObject = EcoreFactory.eINSTANCE.createEOperation();
ExtraPropertiesAdapter adapter = new ExtraPropertiesAdapter();
eObject.eAdapters().add(adapter);
// Set the extra readyToBeProcessed "attribute"
adapter.getProperties().put("readyToBeProcessed", true);
// Get and print the extra readyToBeProcessed attribute
System.out.println(((ExtraPropertiesAdapter) eObject.eAdapters().
stream().filter(a -> a instanceof ExtraPropertiesAdapter).findAny().
orElse(new ExtraPropertiesAdapter())).getProperties().
get("readyToBeProcessed"));
}
public static class ExtraPropertiesAdapter implements Adapter {
protected HashMap<String, Object> properties = new HashMap<>();
public HashMap<String, Object> getProperties() {
return properties;
}
@Override
public void notifyChanged(Notification notification) {}
@Override
public Notifier getTarget() { return null; }
@Override
public void setTarget(Notifier newTarget) {}
@Override
public boolean isAdapterForType(Object type) { return false; }
}
}