【问题标题】:How to tersely define Guice bindings of parametrised classes using Xtend?如何使用 Xtend 简洁地定义参数化类的 Guice 绑定?
【发布时间】:2011-11-20 07:09:53
【问题描述】:

以下 Java 代码设置了 Guice 绑定。它使用AbstractModule 的匿名子类提供configure 的实现来设置绑定,并使用TypeLiteral 的匿名子类为特定类型参数创建MapHashMap 的绑定(as described here) .

injector = Guice.createInjector(new AbstractModule() {
    @Override protected void configure() {
        bind(new TypeLiteral<Map<String, Event>>() {})
            .to(new TypeLiteral<HashMap<String, Event>>() {});
    }
});

我怎么能在 Xtend 中写这个?

据我所知,Xtend 不支持实现匿名类或嵌套类(文档中没有提到它们,我也无法猜出有效的语法)。所以我必须在单独的 Xtend 文件中定义我的AbstractModule 和我的每个TypeLiteral 实现......不是很简洁。我是否缺少 Xtend 或 Guice 技巧以使其正常工作?

【问题讨论】:

    标签: generics syntax guice anonymous-class xtend


    【解决方案1】:

    您可以使用闭包来实现模块接口:

    injector = Guice.createInjector [ 绑定(typeof(SomeType)).to(typeof(AnImplementation)) ]

    但是,这并不能解决类型文字的问题。您必须为此使用 Java,但我认为这不会有什么坏处。

    【讨论】:

      【解决方案2】:

      引入一个真正的类而不是一个匿名的内部类怎么样?

      【讨论】:

      • 嗨,Christian - 这是个好主意,也是我目前的做法。但是,该真正的类必须保留在 Java 中,否则我还必须为所有 TypeLiteral 实现声明真正的类(实际上我的代码有超过上面示例中显示的 2 个)。我对是否有 Xtend 解决方案或其他 Guice API 可以解决问题感兴趣。
      • 让我引用 xtend 的主页: *Xtend 并不是要一起替换 Java,而是在 Java 不发光的情况下成为一个方便的替代方案。 * 我猜 guice 模块是不应该在 xtend 中完成的事情
      【解决方案3】:

      在相关说明中,您可以使用 Xtend 闭包来实现 Guice 的 Provider 接口。

      例如在Java中调用IResourceScopeCache.get:

      @Inject
      private IResourceScopeCache cache;
      
      public EvaluatedResource getEvaluatedResource(EObject object) {
          final Resource resource = object.eResource();
          return cache.get("key", resource, new Provider<Object>() {
              public Object get() {
                  return evaluate(resource);
              }
          });
      }
      
      public EvaluatedResource evaluate(Resource resource) {
          ...; // create EvaluatedResource evaluatedResource
          return evaluatedResource; // return it
      }
      

      在 Xtend 中变成:

      @Inject
      IResourceScopeCache cache
      
      def getEvaluatedResource(EObject object) {
          val resource = object.eResource
          cache.get("key", resource, [|evaluate(resource)])
      }
      
      def evaluate(Resource resource) {
          ... // create EvaluatedResource evaluatedResource
          evaluatedResource // return it
      }
      

      诀窍在于[|...] 是一个带有零参数的函数,在本例中为Provider.get()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 2022-09-09
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        相关资源
        最近更新 更多