我想创建一个注释处理器来替换对的调用GWT.create
。
使用注释处理器,您必须生成两个类,然后根据上下文动态地(在运行时)在它们之间进行选择(您可以生成一个工厂来帮助实现此目的,但是您仍然必须以某种方式来填充工厂使用当前上下文(例如当前语言环境)。
–来源:https://stackoverflow.com/a/29915793/116472
我运行了注释处理器,它很好地生成了类。我不知道的部分是运行时选择部分。
我该如何选择运行时?
我假设您已经涵盖了代码生成方面,仅关注我们如何选择GWT中的正确实现:
但您仍必须以某种方式将当前上下文(例如当前语言环境)提供给工厂。
我们可以按照您的建议在运行时执行此操作,但是从最近为System.getProperty
您添加的支持开始,您也可以在编译时执行此操作。
当然,第一步是为您可能希望访问的每个实现生成代码。以语言环境作为一个例子,你可能有Foo_en.java
,Foo_es.java
,Foo_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] 删除。
我来说两句