Как мне сделать рефакторинг закрытия потока в Java? - PullRequest
1 голос
/ 22 октября 2010

В соответствии с политикой моей компании, касающейся использования Eclipse и использования авто-исправления кода Eclipse, в кодовой базе чрезмерно присутствует следующий шаблон кода:

InputStream is = null;
try {
    is = url.openConnection().getInputStream();
    // .....
} catch (IOException e) {
    // handle error
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {
            // handle error
       }
    }
}

IMO, он чрезвычайно сложен и труден для чтения, особенно часть в блоке finally (есть ли необходимость отлавливать 2 экземпляра IOException?). Есть ли способ оптимизировать код так, чтобы он выглядел чище?

Ответы [ 5 ]

3 голосов
/ 22 октября 2010

Почему что-нибудь? Это рабочий код.Это правильно.

Оставь это.

1 голос
/ 22 октября 2010

Во-первых, об использовании IOUtils - может стоить сказать руководителям, что среда выполнения приложений-сервер / Java, которую они могут использовать, использует IOUtils и подобные библиотеки.так что, по сути, вы не вводите новые компоненты в свою архитектуру.

Во-вторых, нет, не совсем.На самом деле нет другого пути, кроме как написать собственную утилиту, которая будет имитировать метод closeQuietly IOUtils.

1 голос
/ 22 октября 2010
public class Util {
    public static void closeStream(inputStream is) {
        if (is != null) {
            try {
               is.close();
            } catch (IOException e) {
               // log something
        }
    }
}

Теперь ваш код

InputStream is = null;
try {
    is = url.openConnection().getInputStream();
    // .....
} catch (IOException e) {
    // handle error
} finally {
    Util.closeStream(is);
}

Больше ничего не нужно делать, так как IOException в улове может иметь некоторую специфическую обработку.

1 голос
/ 22 октября 2010

См. Этот вопрос , используйте решение closeQuietly().

InputStream is = null;
try {
    is = url.openConnection().getInputStream();
    // .....
} catch (IOException e) {
    // handle error
} finally {
    IoUtils.closeQuietly(is);
}

// stolen from the cited question above
public class IoUtils {

  public static closeQuietly (Closeable closeable) {
    try {
      closeable.close();
    } catch (IOException logAndContinue) {
      ...
    }
  }
}

Или подождите блоков ARM JDK7 .

0 голосов
/ 22 октября 2010

Вы могли бы где-то определить что-то вроде этого:

private static interface InputStreamCallback {

    public void doIt(InputStream is) throws IOException;

}

private void with(InputStreamCallback cb) {

    InputStream is = null;

    // Creational code. Possibly adding an argument

    try {
        cb.doIt(is);
    } catch (IOException e) {
        // handle error or rethrow.
        // If rethrow add throws to method spec.
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                // handle error or rethrow.
            }
        }
    }
}

И вызвать ваш код следующим образом:

with(new InputStreamCallback() {

    @Override
    public void doIt(InputStream is) throws IOException {
        is = url.openConnection().getInputStream();
        // .....
    }

});

Если вы объявите с помощью метода static во вспомогательном классе, тогдаВы могли бы даже сделать import static из этого.

Есть недостаток.Вам нужно объявить url final.

EDIT: код создания не имеет значения.Вы можете организовать это несколькими способами.Обратный вызов это точка.Вы можете выделить то, что вам нужно сделать там.

...