0

今日、GWT コードに次のようなメソッドを見ました。

public Map< String, ResponseObject > getResponse( RequestObject requestObject ) {
    remoteServiceAsync = GWT.create( RemoteServce.class );
    final Map< String, ResponseObject > responseReference = new HashMap< String, ResponseObject >();

    remoteServiceAsync.doServerCall( requestObject, new AsyncCallback< ResponseObject >() {
      public void onFailure(Throwable caught) {
         // TODO: Do something with errors.
      }

      public void onSuccess( ResponseObject response ) {
        responseReference.put( "value", response );
      }
    } );

    return( responseReference );
};

これは非常に悪い習慣だと思います。このコードについてどう思いますか? それはすべてのブラウザで動作しますか?validを読むためのオプションdataですか? データはプログラムの後半でアクセスされるため、データが不足することはありません。

4

2 に答える 2

0

それを返すのは本当に悪い習慣HashmapですRPC advantages

そのメソッドでは、すぐに を返し、empty hash-map後でその に挿入された値を返しますがMap、これは役に立ちません。

そして初期化も

(remoteServiceAsync!=null)以下の行をチェックすることすらありません

remoteServiceAsync = GWT.create( RemoteServce.class );

そのため、呼び出しごとに初期化されます。

于 2013-02-25T11:38:48.010 に答える
0

ここで強調する 2 つのポイントがあります -

1) 非同期呼び出しがいつ戻るかわからないため、return ステートメントを使用して、RPC から返されたオブジェクトを返すことができます。したがって、responseReference は常に空になります。

2) 非同期呼び出しを起動する必要があるたびに RPC インスタンスを作成する必要はありません。したがって、このタイプのシナリオにはシングルトン パターンが推奨されます。

コード スニペットは次のようにリファクタリングできます -

ServiceAsync serviceasync = null;

getServiceAsync()
{
     if(serviceAsync == null)
     {
         serviceAsync = GWT.create( RemoteServce.class );
     }
     return serviceAsync;
}

AsynCallBack asyncCallBack;

getAsyncCallBack()
{
      if(asynvCallback != null)
      {
           return asyncCallback;
      }
      return new AsyncCallback< ResponseObject >() 
            {
                  public void onFailure(Throwable caught) 
                  {
                       // TODO: Do something with errors.
                  }

                   public void onSuccess( ResponseObject response ) 
                   {
                        // Do processing here with the response object ...
                   }
            } );    
}

getResponse() メソッドが呼び出された場所で、そのメソッド呼び出しを次のように置き換えます -

getServiceAsync().doServerCall( requestObject, getAsyncCallBack() );

そのため、サービス インスタンスは 1 つだけで、asyncCallBack インスタンスも 1 つ存在します。複数のオブジェクトの作成が回避されるため、パフォーマンスが向上します。

于 2013-02-25T14:54:53.073 に答える