好的设计方法

时间:2011-08-25 18:06:08

标签: java apache httpresponse

我想要以下方法返回HttpResponse。但与此同时,我不想将HttpResponse初始化为null 这是一种很好的方法,为方法添加throws或添加try/catch块,其中HttpResponse已初始化为null
HttpResponse是一个界面,所以初始化这个没有任何意义 我很期待为HttpResponse添加getter / setter,将其声明为成员变量。

我们很感激。

public HttpResponse executeRestClientServiceCall(final HttpUriRequest request)
    {
        // Verifier;
        HttpResponse httpResponse = null;
        final HttpClient client = new DefaultHttpClient();
        try
        {
            httpResponse = client.execute(request);
            return httpResponse;
        }
        catch (final ClientProtocolException e)
        {
        }
        catch (final IOException e)
        {
        }
        return httpResponse;
    }

2 个答案:

答案 0 :(得分:2)

此时你不应该抓住异常。一点也不。这使您的代码更加简单。您需要做的是释放您使用的所有资源,并正确执行。这是执行此操作的代码:

@Nonnull
public HttpResponse executeRestClientServiceCall(HttpUriRequest request) throws IOException {
  HttpClient client = new DefaultHttpClient();
  HttpResponse httpResponse = client.execute(request);
  try {
    // ... other code ...
  } finally {
    HttpEntity entity = httpResponse.getEntity();
    if (entity != null) {
      entity.getContent().close();
    }
  }
  return httpResponse;
}

此时您无法决定如何处理异常,因此最好的选择是让它滑到调用者。也许他知道如何处理它。

抛出异常会给调用者提供更多的可能性,而不仅仅是返回null

考虑您的其他问题:

  

但与此同时我不想将HttpResponse初始化为null。

这很好,因为您可以编写代码,以便变量始终保持适当的对象。请参阅上面的代码。

  

这是为方法添加throws或添加初始化为null的httpResponse的try / catch块的好方法。

我在上面回答了这个问题。好方法是为方法添加throws子句。

  

我很兴奋为HttpResponse添加getter / setter,将其声明为成员变量。

不要那样做。 HttpResponse是一个通常寿命很短的对象。它应该始终存储在局部变量中,并且当方法返回时,不需要保留它。这与您应该存储在类的字段中的HttpClient不同,因此您可以在以后需要时添加连接池。

答案 1 :(得分:0)

我同意Roland的答案,即不试图处理该级别的例外情况。最好将它呈现给调用者,以便他们能够做出适当的反应。考虑响应可能失败的情况,调用者可以使用更改的请求重试。这与服务器超时或无响应的情况不同,您可能不想重新尝试请求。

如果您确实需要处理该级别的异常,请尝试以下代码;它将消除初始化为零的需要......

public HttpResponse executeRestClientServiceCall(final HttpUriRequest request)
{
    final HttpClient client = new DefaultHttpClient();
    try
    {
        return client.execute(request);
    }
    catch (final ClientProtocolException e)
    {
    }
    catch (final IOException e)
    {
    }
    return null;
}

这种简单的改变也消除了对变量的需要,并使方法的意图更加清晰。使用变量,初始化为null,然后在不同的逻辑分支中设置不同的唯一原因是,如果您尝试删除方法的多个断点。有时候只有一个方法的单一退出点是好的,但从它的外观来看,你并不是首先想要的,所以我建议的应该可以正常工作。