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.