我正在浏览
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 } }
这是源代码片段 – 该方法适用于HttpWebRequest对象.@H_301_7@调用者创建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对象 – @H_301_7@开发人员在整个代码库中反复使用这种模式,这让我觉得它有一些很好的理由.但我只是看不到好处…请指教.
解决方法
在方法入口处,包装的HttpWebRequest实例应为null.这是一种通过return语句之外的其他方式返回实例的方法,即使在方法调用期间出现问题(例如,如果抛出异常).这种模式在某种程度上等同于C#中的关键字out.它还可以用于返回对象的错误状态:
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 }