Попробуйте с ресурсами в Java 7?

В новом синтаксисе Try-with-Resources в Java 7 нужно ли мне беспокоиться о порядке ресурсов?

try (InputStream in = loadInput(...); // <--- can these be in any order?
     OutputStream out = createOutput(...) ){
    copy(in, out);
}
catch (Exception e) {
    // Problem reading and writing streams.
    // Or problem opening one of them.
    // If compound error closing streams occurs, it will be recorded on this exception 
    // as a "suppressedException".
} 

person citizen conn    schedule 13.07.2011    source источник
comment
Если ресурсы зависят друг от друга, да (ну, может быть, в зависимости от того, как они работают). Иначе... нет.   -  person    schedule 13.07.2011


Ответы (4)


Порядок имеет значение тогда и только тогда, когда он имеет значение при использовании обычного синтаксиса try {create resources} finally {close resources}. Ресурсы, которые были получены первыми, будут закрыты последними. См. технические заметки. .

person Prodicus    schedule 13.07.2011

В вашем примере порядок определенно не имеет значения. Вы используете ресурсы только в блоке try, где оба уже доступны. Если бы вы подключались к базе данных, порядок или открытие имели бы значение, но я бы создал отдельный метод для этого. Этот метод должен реализовать AutoClosable и переопределить метод close(). Хотя close() выдает исключение, ваш метод не обязан этого делать.

person Sabina Orazem    schedule 02.02.2019

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

Если ресурсы связаны, вы ДОЛЖНЫ следовать порядку их создания, например, сначала создать Connection, а затем PreparedStatement, у меня нет доказательств, но я думаю, что java закрывает ресурсы в порядке FIFO, чтобы избежать проблем с зависимостями.

person Pankaj    schedule 05.11.2012

Имеет значение, зависит ли открытие ресурса от открытия другого ресурса. Например, если открытие B требует открытия A, вы, очевидно, хотели бы, чтобы сначала было открыто A. Еще одна вещь, на которую следует обратить внимание, это то, что ресурсы закрываются в порядке, обратном их открытию. Например, если вы открываете A, а затем B, то, когда try-with-resources их закроет, сначала закроется B, а затем A.

person Phil    schedule 25.11.2012