向 EObject 实例添加临时基元标记/注释

问题描述 投票:0回答:1

考虑一个 EMF EObject 实例:

EObject eObject = ...

请注意,我无法对

eObject
做出更多假设。

我想添加一个

boolean readyToBeProcessed
标签/注释/属性,除了这个
eObject
之外什么都没有。这意味着 EMF 框架管理的具有相同
.eClass()
的其他对象不应受到任何影响。

这可能吗?

到目前为止我见过的例子:

  1. 创建了一个新的
    EAnnotation
    并使用
    eObject
    eClass()
  2. 注册了注释
  3. 创建了一个新的
    EAttribute
    并使用
    eObject
    eClass()
  4. 注册了注释

但是,这些方法修改了

eClass()
,这在我的情况下是不可接受的。

eclipse-emf
1个回答
0
投票

一种选择是(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; }

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.