2011-07-13 12 views
5

W nowej składni Try-with-Resources w Java 7, czy muszę się martwić kolejnością zasobów?Try-with-resources w 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". 
} 
+1

Jeśli zasoby zależą od * siebie *, tak (dobrze, "może" w zależności od siebie o tym, jak to robią). W przeciwnym razie ... nie. –

Odpowiedz

7

Porządek jest ważny wtedy i tylko wtedy, gdy ma to znaczenie przy używaniu normalnej funkcji try {create resources} finally {close resources}. Zasoby, które pozyskano jako pierwsze, zostaną zamknięte na końcu. Aby uzyskać szczegółowe informacje, patrz the technotes.

0

Rzeczywiście kolejność nie ma znaczenia. Idealnie, jeśli zasoby nie są powiązane, możesz je otworzyć w dowolnej kolejności i można je zamknąć w dowolnej kolejności.

Jeśli zasoby są powiązane, MUSISZ postępować zgodnie z zamówieniem, aby je utworzyć, na przykład najpierw Utwórz połączenie, a następnie Przygotowane zestawienie, nie mam żadnego dowodu, ale myślę, że java zamyka zasoby w porządku FIFO, aby uniknąć problemów z zależnościami.

0

Ważne jest, jeśli otwarcie zasobu zależy od otwarcia innego zasobu. Na przykład, jeśli otwarcie B wymaga otwarcia A, oczywistym jest, że chcesz najpierw otworzyć A. Inną rzeczą, na którą trzeba zwrócić uwagę, jest to, że zasoby są zamykane w odwrotnej kolejności, w jakiej są otwierane. Na przykład, jeśli otworzysz A, a następnie B, wtedy gdy try-with-resources je zamknie, B jest najpierw zamykane, a następnie A.