0

我正在编写几个在多个项目之间共享的库类。其中一些项目是普通的 Java,而其他项目是 GWT 应用程序。对于其中一些类,无论它们需要在 GWT 中还是在 Java 中运行,确切的实现都是不同的(我们不详细说明原因,但正如许多示例之一,Java 中不推荐使用 Date.getMonth,但 Calendar 替换不是' t 在 GWT 中可用)。

有没有办法将某些代码部分标记为与一种或另一种情况有关?

我研究了在 GWT 中使用延迟绑定和类替换,但这需要使用 GWT.create() 实例化类,这对于普通的 Java 应用程序不可用,因此会导致编译错误。

4

2 回答 2

2

找到了一个完美的解决方案:<super-source>我的库的 .gwt.xml 文件中的标签!

基本上,我的库中有以下 EnvironmentFlags 类的两个版本。Java使用的实际库中的一个位于文件夹“ lib ”中:

my.library.EnvironmentFlags 看起来像这样:

package my.library;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = false;
  public static final boolean IS_DEV_MODE = false;
}

然后文件夹“ super /my/library”中的文件如下所示:

package my.library;

import com.google.gwt.core.client.GWT;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = true;
  public static final boolean IS_DEV_MODE = !GWT.isProdMode();
}

现在神奇的是:我的库的 .gwt.xml 文件如下所示:

<module>
  <source       path='lib'   />
  <super-source path='super' />
</module>

这导致使用 EnvironmentFlags 类的第一个版本的普通 Java,它只是将两个标志设置为 false,而 GWT 编译器用从超级源目录加载的第二个版本替换该类的源代码,它设置了 GWT标志为真,DEV_MODE 标志为它从 GWT 获得的任何东西。

现在,在我的代码中,我可以简单地使用以下内容:

if (EnvironmentFlags.IS_GWT) {
  // Do GWT stuff
} else {
  // Do plain-old Java stuff
}

并且,Java 和 GWT 编译器都应该从编译结果中删除相应的不可访问/不需要的代码,即不需要运行时开销。

PS: IS_DEV_MODE 标志实际上与我原来的问题没有任何关系。我只是将它作为免费赠品包含在内,它允许我根据我是在测试还是部署我的 GWT 应用程序让我的代码行为不同(例如,更冗长)。

于 2012-10-14T20:43:36.617 回答
0

听起来您可以使用静态GWT.isClient()true如果您的代码在 GWT 环境(开发或生产)或其他地方运行,它会返回false。您必须包含gwt-user.jar在您的服务器类路径中。例如,在 JVM 中运行以下命令:

import com.google.gwt.core.shared.GWT;

public class Main {
    public static void main(String[] args) {
        System.out.println(GWT.isClient() ? "Running client-side." 
                : "Running server-side.");
    }
}

Running server-side.在您的控制台中生成。

于 2012-10-14T20:38:56.127 回答