用GWT编译时替换类

Janus Troelsen:

我发现需要在项目中使用String.format。但是,这在GWT中不起作用,并且我有使用GWT RegExp的替代产品。但是,我希望我的项目在使用不依赖于GWT的普通Swing接口时运行时不会出现错误。共享的代码取决于String.format。问题是我不知道如何使GWT编译器使用与其他代码不同的类。我已经尝试在一个文件中完成所有操作,但是它不起作用,因为GWT无法处理NoClassDefFoundError异常,该异常用于检测classpath中缺少GWT的时间。

这是我当前的代码:

package testpackage.shared;

import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.regexp.shared.SplitResult;

public class Util {

  public static String format(final String format, final Object... args) {
    try {
      final RegExp regex = RegExp.compile("%[a-z]");
      final SplitResult split = regex.split(format);
      final StringBuffer msg = new StringBuffer();
      for (int pos = 0; pos < split.length() - 1; pos += 1) {
        msg.append(split.get(pos));
        msg.append(args[pos].toString());
      }
      msg.append(split.get(split.length() - 1));
      return msg.toString();
    } catch (NoClassDefFoundError ex)  {
      return String.format(format, args);
    }
  }
}

如何在类路径中不使用GWT的情况下在GWT和JRE上进行编译和运行?在为GWT和Swing / Sun JRE进行构建时,是否真的需要使Ant构建脚本将整个文件替换为另一个文件?

克里斯·勒彻(Chris Lercher):

一种解决方案是使用“ 延迟绑定替换”

<replace-with class="testpackage.shared.UtilGWT">
  <when-type-is class="testpackage.shared.Util"/>
</replace-with>

然后调用GWT.create(Util.class)您的GWT代码。为了避免Swing项目选择UtilGWT类,我将其放在另一个源文件夹中(或者可能指示Ant的javac任务忽略该文件)。

但是,这仍然不允许您重复使用GWT.create()在Swing应用程序中调用的部分代码因此,您必须创建一个工厂,或者在应用程序启动时调用一些初始化,或者类似的事情……如果您没有Dependency Injection,这就是所有常见的问题

如果要使用Dependency Injection(例如,使用Guice / Gin),则替换实现的整个过程将变得非常自然:创建一个抽象的Util类/接口,以及两个实现:UtilGWT和UtilJRE-然后在您的系统中设置正确的实例。模块(您的GWT和Swing应用程序会有一个不同的模块),并且可以在需要的任何地方自动获得正确的实现。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章