7

私はExchangeWebサービスのJavaAPIコードを調べていて、開発者がメソッドに引数を渡す方法の設計上の選択を見ました。テクニックの利点を説明するのを手伝ってもらえますか?

メソッドによって処理される型は、メソッドに渡される前にGeneric Wrapperクラスによってラップされます。たとえば、メソッドがStringで機能する場合、新しいParam()は、Paramが次のように定義されているメソッドに渡されます。続く

class Param<T> {
  private T param; 
  public T getParam() { return param; }
  public void setParam(T param) { this.param = param }
}

ソースからのスニペットは次のとおりです-メソッドはHttpWebRequestオブジェクトで機能します。
呼び出し元は、Paramのインスタンスを作成します。つまり、HttpWebRequestクラスによって制限されます。次に、メソッドのシグネチャでわかるように、そのインスタンスがメソッドに渡されます-

protected HttpWebRequest emit(OutParam<HttpWebRequest> request) 
throws Exception {
   request.setParam(this.getService().prepareHttpWebRequest()); 
   OutputStream urlOutStream = request.getParam().getOutputStream();
   EwsServiceXmlWriter writer = new EwsServiceXmlWriter(this.service,urlOutStream);
   this.writeToXml(writer);
   urlOutStream.flush();
   urlOutStream.close();
   writer.dispose();

   request.getParam().executeRequest();
   if(request.getParam().getResponseCode() >= 400)
   {
      throw new Exception("The remote server returned an error:("+request.getParam().getResponseCode()+")"+request.getParam().getResponseText());
    }
    return request.getParam();
}

次に、HttpWebRequestオブジェクトを渡さないのはなぜですか?開発者はコードベース全体でこのパターンを繰り返し使用しているため、それには何らかの正当な理由があると思います。しかし、私にはその利点がわかりません...啓蒙してください。

4

1 に答える 1

4

メソッドの入り口では、ラップされたHttpWebRequestインスタンスはnullであると予想されます。これは、メソッド呼び出し中に問題が発生した場合でも(たとえば、例外がスローされた場合)、returnステートメント以外の方法でインスタンスを返す方法です。outこのパターンは、C#のキーワードとどういうわけか同等です。オブジェクト+エラーステータスを返すためにも使用できます:

bool getGreetings(OutParam<Greetings> greetings) {
  if (aCondition) {
     greetings.setParam(new Greetings("Hello");
     return true; // everything's fine
   }
   return false;
} 

書くのではなく:

Greetings getGreetings() {
  if (aCondition) {
     return new Greetings("Hello");
  }
  return null; // caller will have to test a null condition to know it the operation was ok
}
于 2012-06-19T20:58:36.330 に答える