0

私はいくつかのプロジェクト間で共有しているいくつかのライブラリクラスを書いています。これらのプロジェクトのいくつかは昔ながらのJavaであり、他のプロジェクトはGWTアプリケーションです。これらのクラスの一部では、GWTで実行する必要があるかJavaで実行する必要があるかによって、正確な実装が異なります(正確な理由については説明しませんが、多くの例の1つとして、Date.getMonthはJavaで非推奨になっていますが、カレンダーの置き換えはありません。 tはGWTで利用可能です)。

コードの特定のセクションをいずれかのシナリオに関連するものとしてマークする方法はありますか?

GWTで遅延バインディングとクラス置換を使用することを検討しましたが、これにはGWT.create()を使用したクラスのインスタンス化が必要です。これは、従来のJavaアプリでは使用できないため、コンパイルエラーが発生します。

4

2 に答える 2

2

美しく機能するソリューションを見つけました:<super-source>私のライブラリの .gwt.xml ファイルのタグです!

基本的に、ライブラリには次の EnvironmentFlags クラスの 2 つのバージョンがあります。フォルダ " lib "にある Java で使用される実際のライブラリの 1 つ:

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 コンパイラは、そのクラスのソースをスーパーソース ディレクトリからロードされた 2 番目のバージョンに置き換え、GWT を設定します。 flag を true に設定し、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環境(DevまたはProduction)または他の場所で実行されている場合に返す静的GWT.isClient()を使用できるように聞こえます。サーバーのクラスパスに含める必要があります。たとえば、JVM で次を実行します。truefalsegwt-user.jar

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 に答える