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.