хороший способ дизайна - PullRequest
       13

хороший способ дизайна

1 голос
/ 25 августа 2011

Я хотел бы иметь следующий метод, который возвращает HttpResponse. Но в то же время я не хочу инициализировать HttpResponse в null.
Это хороший способ сделать, добавив throws для метода или добавив try/catch блоков с HttpResponse, инициализированными в null.
HttpResponse - это интерфейс, поэтому инициализация его не имеет никакого смысла.
Я хотел бы добавить геттеры / сеттеры для HttpResponse, объявив это переменной-членом.

Идеи приветствуются.

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 ]

2 голосов
/ 25 августа 2011

Вы не должны поймать исключение в этой точке.Не за что.Это делает ваш код намного проще.Что вам нужно сделать, это освободить все ресурсы, которые вы использовали, и делать это правильно.Вот код, который должен это сделать:

@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 нулевым значением.

Это хорошо, поскольку вы можете написать свой код так, чтобы переменная всегда содержала надлежащий объект.См. Приведенный выше код.

Что является хорошим способом добавления бросков для метода или добавления блоков try / catch с httpResponse, инициализированным в null.

Я ответил на это выше.Хорошим способом является добавление предложения throws для метода.

Я хочу добавить методы получения / установки для HttpResponse, объявив это как переменную-член.

Не делай этого.HttpResponse - это объект, который обычно имеет очень короткую продолжительность жизни.Он всегда должен храниться в локальной переменной, и когда метод возвращается, нет необходимости сохранять его.Это отличается от HttpClient, который вы должны хранить в поле класса, поэтому вы можете добавить пул соединений позже, если вам это нужно.

0 голосов
/ 25 августа 2011

Я согласен с ответом Роланда о том, что он не пытается обрабатывать исключения на этом уровне. Было бы лучше показать это вызывающему абоненту, чтобы он мог реагировать соответствующим образом. Подумайте о случае, когда ответ может не получиться, вызывающий абонент может повторить попытку с измененным запросом. Это отличается от случая, когда сервер отключился или не отвечает, когда вы, вероятно, не захотите повторять попытку запроса.

Если вам нужно обработать исключения на том уровне, который вы пытаетесь, попробуйте следующий код; это избавит от необходимости инициализации вещей в нуль ...

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;
}

Это простое изменение также устраняет необходимость в переменной и делает цель метода более понятной. Единственная причина, по которой вы будете использовать переменную, инициализированную нулем, а затем по-разному установленную в разных ветвях логики, заключается в том, что вы пытаетесь удалить несколько точек останова метода. Иногда полезно иметь только одну точку выхода для любого метода, но, судя по всему, вы не стремились к этому в первую очередь, поэтому то, что я предложил, должно работать просто отлично.

...