5

GWTについて、具体的な実装を返すメソッドを指定して読んだことがあります。次に例を示します。

public ArrayList<String> getList();

通常好まれる「抽象インターフェース」の代わりに、例えば:

public List<String> getList();

クライアント(つまりjs)コードは、インターフェイスのすべての既知の実装に対応する必要がないため、GWTはより小さなコンパイル済みJavaScriptファイルを生成します(例では、クライアントコードは、、、Listを処理できる必要があります)。など)、未使用の実装をコンパイルしないことでjsを最適化できます。LinkedListArrayListVector

私の密接に関連する質問は次のとおりです。

  • これは本当ですか?(以下の質問はそれが真実であることを前提としています)
  • 最適化は、インターフェースを使用するクラスごとですか、それともアプリケーションごとですか?すなわち
  • 1つのクラスをリファクタリングするだけでメリットがありますか?また
  • すべてのクライアントクラスがインターフェイスを使用しないようにリファクタリングされた場合にのみ、メリットが見られますか?
4

3 に答える 3

6

以下は、GWTRPCサービスのシグニチャの一部としてインターフェイスを使用することを前提としています。GWT RPCサービスのシグニチャでインターフェイスを使用しない場合、インターフェイスの代わりにクラスを使用することによる影響は最小限に抑える必要があると思います(たとえば、GWTコンパイラは使用された実装のみをコンパイルします)

  • これは本当ですか?(以下の質問はそれが真実であることを前提としています)

はい、GWTコンパイラの出力は、サーバーからクライアントに送信される可能性のあるクラスを「よく知っている」と小さくなります。

  • 最適化は、インターフェースを使用するクラスごとですか、それともアプリケーションごとですか?すなわち

GWT RPCの場合、アプリケーションごと。

  • 1つのクラスをリファクタリングするだけでメリットがありますか?

はい。インターフェイスに多くのクラスのコードを含める必要がある場合、1つのインターフェイスを実装に置き換えると、生成されるコードサイズを数kb減らすことができます。

ただし、インターフェイスの代わりに実装を使用する以外に、クラスの「ブラックリスト」をモジュール定義ファイルで定義して、生成されたコードに実装を含めることを明示的に回避することもできます。

<extend-configuration-property name="rpc.blacklist"
    value="-java.util.ArrayList" />  
于 2012-08-20T04:56:24.957 に答える
2

webAppCreatorによって生成されたサンプルアプリに基づいてテストを行いましたが、ビルドに応じて、List<String>またはのいずれかを返す3つの単純なサービスを追加しました。ArrayList<String>

その結果、すべてのサービスを使用することで、リターンタイプを任意に組み合わせた場合よりも、コンパイルされたJavaScriptからArrayList<String> 約5Kb節約できました。

これは、節約が実際のアプリごと(サービスごとではない)であることを証明しています。

また、どれだけ節約できるかを示しますこの場合)。

于 2012-08-20T06:09:00.037 に答える
0

これは、一般的にGWTコンパイラーには実際にはありません。このようなアプローチは、コード生成で使用されるクラスにのみ適用されます。たとえば、リモートプロシージャコールを使用する場合。詳細については、この質問を参照してください。したがって、戻り型として具象クラスの代わりにインターフェースを宣言すると、コンパイラーはコンパイルされたコードにすべての可能な実装を含めます。これにより、コンパイルの時間と生成されるコードの量が増加します。

実際には、RPCなしでGWTを使用してアプリケーションを開発する場合があります。この場合、コンパイルされたコードは、インターフェースを使用するときに肥大化することはありません。

于 2012-08-20T07:00:07.217 に答える