¿Cuál es la mejor forma de obtener transparencia de excepciones en Java cuando se usa una clase interna anónima para ejecutar algún código?Lanzar excepciones comprobadas de clases internas anónimas
Un patrón frecuente que he visto en el código real es el uso de alguna interfaz pseudo Ejecutable para especificar el contexto de algún código dado. El mejor ejemplo que puedo pensar en el JDK es 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
}
}
A pesar de que la lectura del código se puede ver claramente el código interno no hace más de un archivo no encontrado, pero hemos perdido los beneficios de excepciones comprobadas como la persona que llama no es consciente de lo que es en realidad una excepción lanzada. Un error común sería introducir código en la clase interna anónima que lanzaría una nueva excepción y el código no lo forzaría a manejar esa excepción.
Lo que quiero es algo como lo que sigue, ¿se puede lograr este tipo de comportamiento sin un cambio de idioma?
public interface PrivilegedExceptionAction<T,V... extends Throwable>
{
public T run() throws V;
}
Creo que las clases internas anónimas son, en general, una mala idea, principalmente porque no se pueden reutilizar ni ampliar. Pero esta es otra razón. Estoy interesado en cualquier respuesta también. – user949300
Echa un vistazo en http://blogs.sun.com/briangoetz/entry/exception_transparency_in_java – alexsmail
He visto la propuesta de Brian en el proyecto lambda, lamentablemente esto no está disponible en java 6 – bluphoenix