- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个注释处理器来替换对 GWT.create
的调用。
With an annotation processor, you'd have to generate both classes and then dynamically (at runtime) select among them, depending on the context (you could generate a factory to help doing that, but you'd still have to somehow feed the factory with the current context, e.g. the current locale).
– 来源:https://stackoverflow.com/a/29915793/116472
我让我的注释处理器运行,它很好地生成了类。我不知道的部分是运行时选择部分。
我该如何选择运行时?
最佳答案
我假设您已经了解了代码生成方面,只关注我们如何在 GWT 中选择正确的实现:
but you'd still have to somehow feed the factory with the current context, e.g. the current locale).
我们可以按照您的建议在运行时执行此操作,但由于最近添加了对 System.getProperty
的支持,您也可以在编译时执行此操作。
当然,第一步是为您可能想要访问的每个实现生成代码。以语言环境为例,您可能有 Foo_en.java
、Foo_es.java
、Foo_de.java
等
接下来,我们需要一种一致的方法来获取任何一个实现 - 也许是生成的 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 不像 Guice 那样执行 bind(Foo).to(Bar).in(Scope)
,因为这将需要运行代码来解析绑定(bind),而 Dagger 仅根据它可以通过反射类型看到的内容进行操作,而不是实际运行代码。这意味着您最终会得到很多这样的 @Provides 方法,或者使用应该使用什么来实现什么的详细信息来注释您的实际类型。
FWIW 到目前为止我还没有采用 Dagger,因为一些怪癖需要我重新思考一些问题,我还没有花时间去重新思考:
关于java - 如何用注释处理器替换 GWT.create?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29945548/
我是一名优秀的程序员,十分优秀!