Java OCAJP7: ordine di chiusura delle risorse acquisite con un try-with-resources

Abbiamo visto in un articolo precedente il funzionamento del costrutto try-with-resources introdotto da Java 7. In questo breve esempio facciamo ulteriore chiarezza su un aspetto che potrebbe emergere in sede di esame OCAJP7 (e magari anche di OCPJP7), ovvero l’ordine in cui vengono rilasciate le risorse acquisite.
Le risorse acquisite in un try-with-resource vengono rilasciate nell’ordine inverso a quello in cui sono state acquisite dallo statement.
Verifichiamo la cosa creando due classi che implementano le interfacce necessarie a renderle utilizzabili in un try-with-resource, ovvero Closeable o AutoCloseable, ed implementando i relativi metodi close() in modo che stampino l’indicazione della classe dell’oggetto che si sta chiudendo. Dopodichè creiamo due istanze delle classi direttamente all’interno del try-with-resource, cioè tra le parentesi tonde, ricordando che quando si devono gestire più risorse occorre separarle con un ‘;
A questo punto, una volta che il blocco try è terminato, le risorse vengono automaticamente rilasciate, invocando i relativi metodi close() ed è quindi possibile vedere quale viene invocato prima.

import java.io.Closeable;
import java.io.IOException;

class MyCloseableImpl implements Closeable {

    @Override
    public void close() throws IOException {
        System.out.println("Chiudo MyCloseableImpl...");
    }
}

class MyAutoCloseableImpl implements AutoCloseable {

    @Override
    public void close() throws IOException {
        System.out.println("Chiudo MyAutoCloseableImpl...");
    }
}

public class VerifyClosingOrder {

    public static void main(String[] args) {
        try (Closeable closeableImpl = new MyCloseableImpl();
                AutoCloseable autoCloseableImpl = new MyAutoCloseableImpl()) {

            // fai qualcosa con le risorse acquisite
        }
        catch (Exception ignore) {
            // gestisci eventuali eccezioni
        }
    }
}

Il risultato dell’esecuzione di questo semplice programma di test è il seguente:

Chiudo MyAutoCloseableImpl...
Chiudo MyCloseableImpl...

Come possiamo vedere la prima risorsa che viene rilasciata, su cui quindi viene invocato il metodo close(), è l’oggetto della classe MyAutoCloseableImpl che è il secondo ad essere acquisito, mentre l’oggetto della classe MyCloseableImpl, che viene creato ed acquisito per primo nel try-with-resources viene rilasciato per ultimo.

This entry was posted in $1$s. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *