java resources serversocket outputstream

java - Manera adecuada de cerrar un AutoCloseable



resources serversocket (1)

¿Cuál es el patrón más confiable a seguir al cerrar un OutputStream , ServerSocket u otro objeto que implementa la interfaz de AutoCloseable ?

¿Debo usar try - catch - finally ? O un gancho de cierre.


La forma correcta de usar una instancia de AutoCloseable es con un bloque try -with-resources , por lo que el recurso se closed manera confiable incluso si se lanza una excepción.

Me gusta esto:

try (OutputStream stream = new ...) { ... // use the resource } catch (IOException e) { ... // exception handling code }

También puede controlar múltiples recursos utilizando un bloque (en lugar de bloques anidados):

try ( OutputStream out1 = ...; OutputStream out2 = ...; InputStream in1 = ...; InputStream in2 = ...; ) { ... }

No utilice un bloque try ... por finally : eso se comportará mal en algunos casos de borde (los casos que requieren una excepción suprimida ).

No use un gancho de cierre: los recursos rara vez son verdaderamente pesados, y ese enfoque será propenso a los riesgos de la raza. try -with-resources es la manera recomendada de cerrar correctamente todos los recursos de AutoCloseable : los dos se introdujeron en Java al mismo tiempo para que puedan trabajar juntos.

Hacer esto implícitamente ayuda a implementar la regla (recomendada) de que solo el código responsable de crear o abrir algo es responsable de eliminarlo o cerrarlo: si un método recibe un OutputStream , nunca debe close() . En su lugar, debe confiar en que la persona que llama lo cierre. Si ninguno de sus métodos llama explícitamente a close() , se garantiza que su código nunca lanzará una excepción (como una "Socket cerrada" java.net.SocketException ) porque intenta usar un recurso que se ha cerrado.

Al hacer esto se asegura que el recurso se cierre precisamente una vez. Tenga en cuenta que, en general, no es seguro cerrar un AutoCloseable más de una vez: no se garantiza que la operación close() sea ​​idempotente.