Använda AutoCloseable och undvika checked exceptions

Om man vill använda AutoCloseable i Java 7 och högre ser man ganska snabbt att metoden close kastar Exception:

public interface AutoCloseable { 
    void close() throws Exception; 
}

Detta gör en inte glad om man vill undvika checked exceptions. En implementation enligt följande:

public class Resource implements AutoCloseable { 
    @Override
    public void close() throws Exception { 
        //stäng något 
    }
}

leder nämligen till att man måste hantera Exception på något sätt i try-blocket:

try(Resource r = new Resource()) { 
    // gör något med r 
} catch(Exception e) { 
    //hantera e som vi inte ville ha från början 
}

Nyckelinsikten här är att man kan overrida metoder som slänger checked exceptions med sådana som inte gör detta (se JLS §8.4.8.3). Just detta omnämns även i dokumentationen till AutoCloseable.html#close(). Så vi kan implementera utan att slänga exceptions:

public class Resource implements AutoCloseable { 
    @Override
    public void close() { 
        //stäng något
    }
}

Detta gör att vi kan ha en try utan checked-exception hantering:

try(Resource r = new Resource()) { 
    // gör något med r
}

Mission accomplished.