在 ECore 中实现缓存的限定名

Implementing cached qualified names in ECore

我必须 类、Container 和 Containable,我想实现限定名称 (root/containerA/containerB/containableXYZ)

因此,Container 派生自 Containable 并且 Containable 有一个全名 属性,我将其设置为派生的、瞬态的和易变的,它有效

return (parent != null) ? parent.getName() + SEPARATOR + getName() : getName();

但现在我担心在层次结构的每个级别的大型模型中,不必要地计算相同的路径 - 每个容器都可以缓存它的路径

但是如果容器的父容器发生变化 - 我如何自动重新计算它的路径?

EMF 中,对象包含在具有树状层次结构的 Resource 中。您可以做的是扩展资源以在对象从树上附加或分离时进行拦截。

参见:ResourceImpl.attached()

您可以做的另一件事是覆盖 eBasicSetContainer() 方法 class。最好的办法是为所有模型 class 设置一个抽象的共同根 class。那么你可以做的就是拦截这个方法,当新的容器对象不为null时更新路径。

在这两种情况下(拦截 Resource 或 EObject),请确保您还重新计算了正在更改的元素的子树中任何包含元素的路径。这可以通过使用以下方法递归迭代子树重新计算路径来轻松完成:EcoreUtil.getAllProperContents(EObject)

BTW,你也可以使用EcoreUtil.getIdentification()其中returns的限定名使用其 URI 的元素。