Java 是否允许它访问Xtext验证程序中的其他资源?

Java 是否允许它访问Xtext验证程序中的其他资源?,java,validation,xtext,xtend,Java,Validation,Xtext,Xtend,我遇到过另一个开发人员的一些代码,他试图根据其他对象验证对象FooBar,代码的作用如下: // Xtend code @Inject IContainer.Manager containerManager @Inject IResourceDescriptions resourceDescriptions @Inject Provider<XtextResourceSet> resourceSetProvider @Check def validate(FooBar fooba

我遇到过另一个开发人员的一些代码,他试图根据其他对象验证对象
FooBar
,代码的作用如下:

// Xtend code

@Inject IContainer.Manager containerManager
@Inject IResourceDescriptions resourceDescriptions
@Inject Provider<XtextResourceSet> resourceSetProvider

@Check
def validate(FooBar foobar) {
  var desc = resourceDescriptions.getResourceDescription(foobar.eResource.URI)
  var visibleContainers = containerManager.getVisibleContainers(desc, resourceDescriptions)

  for (visibleContainer : visibleContainers) {
    var exported = visibleContainer.getExportedObjectsByType(ModelPackage.Literals.BOOFAR)
    var allObjects = newArrayList

    exported.forEach [boofar |  
      // this is the line I'm interested about -->  
      allObjects.add(resourceSetProvider.get.getEObject(boofar.EObjectURI, true) as BooFar)
    ]
    // ...
  }
  // ...
}
允许这样做吗?我的想法是,这可能会导致问题,因为此代码会干扰
XtextBuilder
ResourceSet
,如果我们使用
ParallelResourceLoader
,那么它甚至可能会导致竞争条件


总而言之:我想知道上面的两个变体是否只是坏的,甚至是被禁止的。

除了速度慢之外,代码(理论上)是好的。尽管这总是取决于AllObject中的对象将发生什么。假设两个导出的对象来自同一资源,列表将包含来自两个不同资源的两个对象,并且相等性检查或比较等操作变得不必要的困难

在自己的资源集的上下文中执行相同的操作通常是可以的。生成器将在触发验证之前并行加载。然而,根据您的项目结构,加载所有对象可能会超过JVM的内存限制。通常,如果事情接近Xmx,XtextBuilder会尝试释放内存。如果验证加载了所有资源,则此机制无法启动


长话短说:基于IEObjectDescriptions进行验证肯定是推荐的方法。每个对象都有自己的资源集的变体非常糟糕。第二种变体只是不好。两者都是允许的,但都不鼓励。

好的,谢谢你的快速回答,祝你周末愉快!:-)
  allObjects.add(EcoreUtil.resolve(boofar.EObjectOrProxy, foobar.eResource.resourceSet) as BooFar)