如何用注释处理器替换GWT.create?

联合体

我想创建一个注释处理器来替换对的调用GWT.create

使用注释处理器,您必须生成两个类,然后根据上下文动态地(在运行时)在它们之间进行选择(您可以生成一个工厂来帮助实现此目的,但是您仍然必须以某种方式来填充工厂使用当前上下文(例如当前语言环境)。

来源:https//stackoverflow.com/a/29915793/116472

我运行了注释处理器,它很好地生成了类。我不知道的部分是运行时选择部分。

我该如何选择运行时?

科林·阿尔沃斯(Colin Alworth)

我假设您已经涵盖了代码生成方面,仅关注我们如何选择GWT中的正确实现:

但您仍必须以某种方式将当前上下文(例如当前语言环境)提供给工厂。

我们可以按照您的建议在运行时执行此操作,但是从最近为System.getProperty添加的支持开始,您也可以在编译时执行此操作。

当然,第一步是为您可能希望访问的每个实现生成代码以语言环境作为一个例子,你可能有Foo_en.javaFoo_es.javaFoo_de.java,等。

接下来,我们需要一种一致的方法来获得任何一种实现-可能是generate FooFactory,并且使用类似这样的方法:

public static Foo getFoo(String locale) {
  if ("en".equals(locale)) {
    return new Foo_en();
  } else if /*...
  ...*/

  throw new IllegalArgumentException("Locale " + locale + " is not supported");
}

如果在运行时询问用户想要的语言环境,则可以将该值传递给此工厂方法以获得所需的实现。同样,如果您可以在运行时从某个值读取该值,则可以再次获取正确的实例并继续进行操作。


但是,如果您实际上想让编译器为您选择呢?让我们保留由注释处理器生成的代码,但将选择语言环境的阶段移至编译器及其排列。

与现有的GWT代码中一样,为区域设置指定属性,并指定多个值。然后,与其询问用户或在运行时在自己的Java代码中确定所需的语言环境,不如使用GWT通常使用的选择脚本连接(检查url,cookie,元标记,用户代理本身,等等)-您可以property-provider根据需要为此构建自己的文件。

和以前一样,我们可以使用getFoo(locale),但是现在我们使用System.getProperty来读取在.gwt.xml文件中创建的属性。对于每个排列,它将被静态编译为正确的常数。但是,与其在FooFactory.getFoo(System.getProperty("locale"))每次需要一个实例时都调用它,不如在生成的FooFactory中创建另一个方法:

public static Foo getFoo() {
  return getFoo(System.getProperty("locale"));
}

现在我们可以调用FooFactory.getFoo(),我们将获得当前排列的正确类。


Dagger问题:Thomas可能更适合解决此问题,但是不,Dagger2并不bind(Foo).to(Bar).in(Scope)像Guice那样,因为那将需要运行代码来解析绑定,而Dagger只能根据其所反映的内容进行操作。类型,而不是实际运行代码。这意味着您最终会遇到许多@Provides方法,或者在实际类型上加上应用于实现内容的详细信息。

FWIW到目前为止,由于一些怪癖需要我重新考虑一些问题,因此我没有采用Dagger,并且我还没有花时间进行重新思考:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何用if语句替换预处理器宏?

来自分类Dev

如何使自己的注释处理器递增?

来自分类Dev

如何获得在注释处理器的注释参数

来自分类Dev

泽西注释的注释处理器

来自分类Dev

如何检查注释处理器中的方法参数类型?

来自分类Dev

Jeta:如何创建自定义注释处理器

来自分类Dev

如何从Gradle插件调用注释处理器

来自分类Dev

如何为 kotlin/native 编写注释处理器?

来自分类Dev

为什么GWT使用代码生成器而不是注释处理器?

来自分类Dev

来自Java注释处理器的@SuppressWarnings

来自分类Dev

指定注释处理器的顺序

来自分类Dev

注释处理器生成的引用类

来自分类Dev

Eclipse中的空注释处理器

来自分类Dev

注释和处理器之间的匹配

来自分类Dev

注释处理器生成的引用类

来自分类Dev

动态更改注释处理器

来自分类Dev

Eclipse中的空注释处理器

来自分类Dev

如何在注释处理器读取从嵌套注释一类[]值

来自分类Dev

如何确保注释处理器始终应用于所有带注释的元素?

来自分类Dev

如何在注释处理器中获取注释方法的返回类型?

来自分类Dev

我可以使用Java 6注释处理器/ JSR 269在Maven中为GWT生成代码吗?

来自分类Dev

如何用clone()替换pthread_join()和pthread_create()

来自分类Dev

间接预处理器替换C

来自分类Dev

间接预处理器替换C

来自分类Dev

找不到Maven注释处理处理器

来自分类Dev

注释处理器仅处理最近更改的类

来自分类Dev

如何在Gradle中使用自定义Java注释处理器?

来自分类Dev

如何在注释处理器中捕获常量表达式?

来自分类Dev

如何在注释时从注解处理器内部检查包是否存在?

Related 相关文章

热门标签

归档