将参数传递给方法的奇怪方法

bel*_*ll0 7 java generics parameters

我正在浏览Exchange Web Services Java API代码,并看到了开发人员将参数传递给其方法的设计选择.您可以帮助解释一下该技术的好处 -

在传递给方法之前,该方法要处理的类型由Generic Wrapper类包装,例如,如果该方法要处理String,则将新的Param()传递给Param定义为的方法如下

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

这是源代码片段 - 该方法适用于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();
}
Run Code Online (Sandbox Code Playgroud)

那么为什么不直接传递HttpWebRequest对象 - 开发人员在整个代码库中反复使用这种模式,这让我觉得它有一些很好的理由.但我只是看不到好处...请指教.

Yan*_*lea 4

在方法入口处,包装的 HttpWebRequest 实例预计为 null。这是一种通过 return 语句以外的方式返回实例的方法,即使在方法调用期间出现问题(例如抛出异常)。这种模式在某种程度上相当于outC# 中的关键字。它还可以用于返回一个对象+一个错误状态:

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

而不是写:

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
}
Run Code Online (Sandbox Code Playgroud)