Java >> Tutorial de Java >  >> Java

¿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 .


Etiqueta Java