Qual è il modo migliore per ottenere Exception Transparency in Java quando si utilizza una classe interna anonima per eseguire codice.Thinging Checked Exceptions from Anonimo Inner Classes
Uno schema frequente che ho visto nel codice reale è l'utilizzo di alcune interfacce tipo pseudo Runnable per specificare un contesto per un determinato codice. L'esempio migliore che riesco a pensare nel JDK è java.security.PrivilegedExceptionAction.
try {
boolean success = AccessController.doPrivileged(
new PrivilegedExceptionAction<Boolean>() {
@Override
public Boolean run() throws Exception {
// do something
// read file
FileInputStream fileInputStream =
new FileInputStream(new File("someFile"));
return true;
}
}
);
} catch (PrivilegedActionException e) {
if (e.getCause() instanceof FileNotFoundException) {
// handle IO exception
} else {
// impossible no other checked exception
}
}
Anche se la lettura del codice si può chiaramente vedere il codice interno getta solo un file non trovato, ma abbiamo perso i benefici di eccezioni controllate come il chiamante non è a conoscenza di ciò che è in realtà un'eccezione gettata. Un bug comune sarebbe quello di introdurre il codice nella classe interna anonima che genererebbe una nuova eccezione e il codice non forzerebbe a gestire quell'eccezione.
Quello che voglio è qualcosa di simile a ciò che è sotto, è questo tipo di comportamento raggiungibile senza un cambio di lingua?
public interface PrivilegedExceptionAction<T,V... extends Throwable>
{
public T run() throws V;
}
Penso che le classi interne anonime siano, in generale, una cattiva idea, principalmente perché non possono essere riutilizzate o estese. Ma questa è un'altra ragione. Sono interessato anche a qualsiasi risposta. – user949300
Dai un'occhiata a http://blogs.sun.com/briangoetz/entry/exception_transparency_in_java – alexsmail
Ho visto la proposta di Brian sotto progetto lambda, purtroppo questo non è disponibile in java 6 – bluphoenix