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

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

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

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

person Rishi    schedule 25.08.2011    source источник
comment
Интерфейсы могут быть нулевыми, и для них такой же смысл быть нулевым, как и для класса.   -  person Kirk Woll    schedule 25.08.2011
comment
И никогда не используйте в своем коде необработанные обработчики исключений без комментариев.   -  person Kirk Woll    schedule 25.08.2011
comment
Этот вопрос лучше задать на programmers.stackexchange.com.   -  person Jesse Webb    schedule 25.08.2011
comment
вы должны посмотреть Spring RestTemplate. Пока вы заново изобретаете колеса, вы должны, по крайней мере, выяснить, какие особенности и недостатки есть у существующих колес.   -  person Kevin    schedule 25.08.2011


Ответы (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.

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

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

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

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

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

person Roland Illig    schedule 25.08.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;
}

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

person Jesse Webb    schedule 25.08.2011