Пробный заказ с закрытыми ресурсами - PullRequest
0 голосов
/ 08 октября 2018

Я смотрю на примеры try-with-resources в Java и понимаю следующее:

try (Connection conn = DriverManager.getConnection(url, user, pwd);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(query);) {
  ...
}

Итак, порядок закрытия:

rs.close();
stmt.close();
conn.close();

, которыйидеально, потому что соединение имеет оператор, а оператор имеет результирующий набор.

Однако в следующих примерах порядок закрытия, я думаю, является обратным ожидаемому:

Пример 1:

try (FileReader fr = new FileReader(file);
     BufferedReader br = new BufferedReader(fr)) {
  ...
}

Порядок закрытия:

br.close();
fr.close();

Пример 2:

try (FileOutputStream fos = new FileOutputStream("testSer.ser");
    ObjectOutputStream oos = new ObjectOutputStream(fs);) {
    ...
}

Порядок закрытия:

oos.close();
fos.close();

Верны ли эти примеры?Я думаю, что закрытие в этих примерах должно быть другим, потому что:

  1. В примере 1 BufferedReader имеет FileReader.
  2. В примере 2 ObjectOutputStream имеет FileOutputStream.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я думаю, что был не прав, когда сказал, что «у соединения есть оператор, а у оператора есть набор результатов».Может быть, наоборот: «у результирующего набора есть оператор, а у оператора есть соединение» или, по крайней мере, «результирующий набор был создан с помощью оператора, а оператор был создан с помощью соединения».

Так что я думаю:

try (Parent parent = new Parent();
     Child child = parent.createChild();) {
    ...
}

Эквивалентно:

try (Parent parent = new Parent();
     Child child = new Child(parent);) {
    ...
}
0 голосов
/ 08 октября 2018

Порядок одинаков: он всегда противоположен порядку, в котором указаны ресурсы.Начиная с JLS :

Ресурсы закрываются в обратном порядке по сравнению с тем, в котором они были инициализированы.

Однако, если указанные позже ресурсысами вызывают метод close() ранее указанных ресурсов (как в случае BufferedReader и ObjectOutputStream), может показаться, что они не происходят в ожидаемом порядке (и что close() будет вызвано несколько разраз).

...