2012-05-10 11 views
8

Oczekiwalem znalezc XMLStreamReader jako AutoCloseable w Javie 7. Jednak tak nie jest. Czy istnieje techniczny powód, dla którego interfejsy czytnika/programatora StAX nie były (lub nie powinny) zostać zmodernizowane w celu wdrożenia AutoCloseable? Oni już mają bliskie metody, których intencja nie różni się od metody ścisłej z AutoCloseable.Dlaczego klasy StAX nie zostały zmodernizowane dla ARM w Javie 7

Odpowiedz

8

Jeśli przyjrzeć się bliżej close() method of AutoCloseable:

Zamyka ten zasób, rezygnując żadnych środków zabezpieczających. Ta metoda jest wywoływana automatycznie na obiektach zarządzanych przez instrukcję try-with-resources.

Albo nawet Closeableclose() method:

Zamyka ten strumień i zwalnia zasoby systemowe związane wszelkie z nim. Jeśli strumień jest już zamknięty, wywołanie tej metody nie ma żadnego efektu.

Podczas gdy close() method of XMLStreamReader mówi:

Zwalnia wszelkie zasoby związane z tym Reader. Ta metoda nie powoduje zamknięcia podstawowego źródła sygnału wejściowego.

istocie źródłem sygnału jest zarządzany przez Reader które implementują interfejs Closeable. Czytelnik może być blisko w try-with-ressource.

Na przykład:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
    XMLStreamReader reader = null; 
    try (FileReader fr = new FileReader("file.xml")) { //Will close the FileReader 
     reader = factory.createXMLStreamReader(fr); 
     reader.close(); 
    } 
    catch (XMLStreamException ex) { 
     if(reader!=null)try { 
      reader.close(); 
     } catch (XMLStreamException ex1) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex1); 
     } 
    } 
+0

Ja osobiście przebuduję ten kod. reader.close() powinien znajdować się w bloku finally w przypadku wystąpienia wyjątku (twój catch jest tylko dla wyjątku XMLStreamException, ale może również wyrejestrować niesprawdzony wyjątek). Usunąłbym także sprawdzanie, czy czytnik jest pusty i po prostu zagnieździł drugi poziom spróbuj w końcu w drugim bloku try. – Trejkaz

0

Nie ma powodów technicznych nie mogli dokonały te rzeczy AutoCloseable. Myślę, że to sprowadza się do lenistwa lub niedostatecznego czasu na szukanie metod zwanych close().

Powiązane problemy