我必须类Container和Containable,我想实现限定名称(root/containerA/containerB/containableXYZ)
因此,Container派生自Containable,并且Containable有一个fullName属性,我将其设置为派生的、瞬态的&挥发性的,起作用的
return (parent != null) ? parent.getName() + SEPARATOR + getName() : getName();
但现在我担心,在层次结构的每个级别的大型模型中,不必要地计算相同的路径——每个容器都可以缓存其路径
但是,如果容器的父级发生更改,我如何自动重新计算它的路径?
InEMF对象包含在具有树层次结构的资源中。您可以做的是扩展Resource以在对象从树中附加或分离时进行拦截。
请参阅:ResourceImpl.attached()
您可以做的另一件事是覆盖类中的方法eBasicSetContainer()。最好的方法是为所有模型类提供一个抽象的公共根类。然后,当新的容器对象不为null时,您可以拦截此方法并更新路径。
在这两种情况下(截取Resource或EObject),请确保还重新计算正在更改的元素的子树中包含的任何元素的路径。这可以通过使用EcoreUtil.getAllProperContents(EObject)在子树上递归迭代重新计算路径来轻松完成
顺便说一句,您还可以使用EcoreUtil.getIdentification(),它使用元素的URI返回元素的限定名。