¿Por qué AutoCloseable es la interfaz base para Closeable (y no al revés)?
De esta forma, todo el código de usuario que implementó 00
automáticamente llega a implementar 18
, lo que les permite beneficiarse automáticamente de la sintaxis de prueba con recursos.
El comentario de @Sotirios Delimanolis ha dado en el clavo.
El equipo de Java 7 quería un mecanismo para etiquetar objetos que se pudieran cerrar automáticamente para la construcción "probar con recursos". Desafortunadamente, la especificación API para el 26
El método es demasiado estricto. Requiere el 39
método para ser idempotente... pero esto no es necesario en el caso de uso "probar con recursos".
Así que introdujeron el 41
interfaz con un 57
menos restrictivo semántico... y adaptado 67
como subtipo de 75
.
La otra cosa es que 82
se declara arrojando 97
en lugar de 102
. Esto significa que el 114
La API es menos restrictiva que 127
... y dado que se usa efectivamente como una devolución de llamada API en try-with-resources, esto lo hace más flexible/más ampliamente aplicable. (La API se puede usar para recursos que no tienen nada que ver con E/S, pero aún así pueden arrojar excepciones al cerrar). El método se había inyectado en el subtipo.
Las alternativas hubieran sido:
-
para restringir "probar con recursos" a recursos con un cierre idempotente... lo que limita su utilidad, o
-
para cambiar retrospectivamente la semántica de
147
... lo que podría generar dificultades para las personas que transfieren código antiguo a Java 7 -
para cambiar retrospectivamente la firma de
154
... lo que rompería la compatibilidad binaria.
El 165
interfaz se introdujo en Java 5. Cuando 170
(abajo hay un código de ejemplo) se introdujo en Java 7, los diseñadores del lenguaje querían cambiar algunas cosas pero necesitaban compatibilidad con versiones anteriores (todo el código que está escrito en versiones anteriores no debería volverse obsoleto con la introducción de nuevas funcionalidades), también crearon un Superinterfaz 187
con las reglas que querían.
Un ejemplo de prueba con recursos:
try (NewResource a = NewResource.CreateResource();
{
}
El código anterior es Try with resources. Simplemente podemos entender por esto que en este código podemos declarar una nueva variable en el código de prueba y esa variable puede llamar a otros métodos dentro del código. Además de disminuir la verbosidad de 197
bloquear este código tampoco requiere un bloque finalmente, pero el entorno de ejecución debe ser Java 7 o superior. Aunque finalmente es creado por la propia JVM.
206
&219
la interfaz contiene solo un método
void close()
Mientras que 229
método de 233
lanza 247
, 252
de 263
método arroja 272
.