In Java wann wird der letzte Block in einem Konstruktor ausgeführt?

8

Zum Beispiel:

%Vor%

Wird der InputStream, der an den Instructor übergeben wird, sofort geschlossen, nachdem das Testobjekt erstellt wurde? Oder ist es geschlossen, wenn das Testobjekt zerstört wird? Ich weiß nicht, wie man etwas ähnlich einem Destruktor in C ++ implementiert.

    
nomnom 31.10.2013, 07:10
quelle

2 Antworten

11

Es wird als Teil eines Konstruktors ausgeführt. Der Code, der in einem Konstruktor ausgeführt wird, ist normaler Code - es gibt dort keinen ungeraden Kontrollfluss. (Ich meine nach dem Aufruf des Superklassenkonstruktors und der Variablen / Instanzinitialisierer, die ausgeführt werden.)

Es gibt keine Entsprechung zu einem C ++ - Destruktor in Java. Am nächsten kommt ein Finalizer , aber das sollte nicht als Äquivalent eines C ++ - Destruktors verwendet werden. (Sie sollten fast nie Finalizer schreiben. Es gibt Fälle, in denen sie beim Herunterfahren nicht aufgerufen werden, und sie werden nicht-deterministisch genannt.)

In dem Fall, den Sie angegeben haben, würden Sie wahrscheinlich nicht möchten, dass Ihre Klasse die Verantwortung für das Schließen des Eingabestreams übernimmt - normalerweise ist der Code, der den Stream öffnet, auch für das Schließen verantwortlich. Wenn Sie jedoch dafür die Verantwortung übernehmen oder es einfach für Anrufer vereinfachen möchten, möchten Sie wahrscheinlich eine close() -Methode bereitstellen, die den Stream einfach schließt. Vielleicht möchten Sie auch AutoCloseable implementieren, damit Anrufer dies tun können Verwenden Sie eine try-with-resources-Anweisung mit Ihrer Klasse:

%Vor%

Das ruft test.close() automatisch am Ende des Blocks try auf.

    
Jon Skeet 31.10.2013, 07:12
quelle
2

Schließlich wird sofort nach dem Versuch ausgeführt. Es spielt keine Rolle, dass es im Konstruktor ist. Es ist in JLS .

Es sagt:

  

Eine try-Anweisung mit einem finally-Block wird ausgeführt, indem zuerst der try-Block ausgeführt wird. Dann gibt es eine Wahl:

     
  • Wenn die Ausführung des try-Blocks normal abgeschlossen wird, dann die endgültige   Block wird ausgeführt, und dann gibt es eine Auswahl:   
    • Wenn der finally-Block normal abgeschlossen wird, dann die try-Anweisung   normal abgeschlossen.
    •   
    • Wenn der finally-Block aus Gründen S abrupt beendet wird, dann versuche es   Die Aussage endet abrupt aus dem Grund S.
    •   
  •   
    
Subhrajyoti Majumder 31.10.2013 07:12
quelle

Tags und Links