2

この質問は、別の質問に対して受け取った回答に基づいています: https://stackoverflow.com/a/3060233/323357

私の理解では、インターフェイスを使用してサービスで戻り値の型とパラメーターの型を宣言すると、コンパイラーは複数のコンパイル ユニットを生成する必要があり、コンパイル時間と生成されるファイルのサイズが増加します。

これは事実ではないと思いますが、最新バージョンの gwt コンパイラ (2.4 - 2.5) には、不要なコンパイル ユニットを検出する方法があります...

  • ローカル変数とパラメータの場合?

    void someFunction()
    {
        ArrayList<String> list = new ArrayList<String>();
        privateFunction(list); //only use of the private function
    }
    
    private void privateFunction(List<String> list)
    {
        Set<Integer> set = new HashSet<Integer>();
        //do stuff without reallocating list or set
    }
    
  • 最終メンバー向け?

    private final Interface member = new InterfaceImpl();
    
    @override
    Interface getInterface()
    {
        return this.member;
    }
    
  • リターンタイプ?

    List<String> myFunction()
    {
        List<String> ret = new ArrayList<String>();
        //do stuff and fill the list
        return ret;
    }
    
  • サービスで?

    //Service Interface
    List<String> myService();
    
    //Service implementation
    List<String> myService()
    {
        List<String> ret = new ArrayList<String>();
        //do stuff and fill the list
        return ret;
    }
    
4

1 に答える 1

1

4 つの例のうち最初の 3 つについては心配しないでください。クライアント側でのインターフェイス (または多くのサブクラスを持つクラス) の使用にはコストがかかりません。インスタンス化されたクラスを分析することで、不要なクラスを簡単に検出できます。疑わしい場合は、コンパイル レポートを調べてください。

ただし、これはサーバー側呼び出しの GWT-RPC では不可能です。クライアントは、サーバーがどのインスタンスを作成するかを知る方法がありません。それを考慮してください

  • 同じクライアントは、更新されたバージョンのサーバーで引き続き動作できます (サービス定義が変更されていない限り)。
  • サーバーはリフレクションを使用してオブジェクトを動的に生成できます: 宣言された型の任意のサブタイプ (ちなみに、これがクライアント側でリフレクションを使用できない主な理由です)

このコード サイズのオーバーヘッドを排除できる唯一の方法は、次のいずれかです。

  • 型安全性をあきらめる (JSON ベースのアプローチを使用できます!)
  • または、コンパイル中にサーバー側を分析し、動的に生成されたオブジェクトを転送することを禁止します (これには、サーバー側のオブジェクトのインスタンス化コードが変更されるたびに GWT の再コンパイルが必要になります)
于 2012-09-28T19:52:32.283 に答える