2009-07-20 21 views
8

han visto este comentario en un método:¿Por qué InputStream y OutputStream implementan Cerrar y Socket no?

//I wonder why Sun made input and output streams implement Closeable and left Socket behind 

Se evitaría la creación de contenedor de clase interna anónima que implementa el que los delegados que se pueda cerrar su método cerca de una instancia de Socket.

+1

¿Por qué no hace la pregunta? En su lugar, citan un comentario y el comentario contiene la pregunta que es más difícil de leer. – Buttons840

+0

@ Buttons840 Creo que la pregunta se plantea claramente en el título. El cuerpo contiene una descripción. –

Respuesta

8

Closeable se introdujo en Java5 mientras que Socket se introdujo en JDK 1.0. En Java7 Socket will be Closeable.

EDITAR

Puede utilizar la reflexión con el fin de cerrar cualquier objeto "que se puede cerrar" en Java 4/5/6 simplemente comprobando la presencia de un método close. El uso de esta técnica le permite cerrar, digamos, un ResultSet (que tiene un método close() pero no implementa Closeable):

public static universalClose(Object o) { 
    try { 
     o.getClass().getMethod("close", null).invoke(o, null); 
    } catch (Exception e) { 
     throw new IllegalArgumentException("missing close() method"); 
    } 
} 
+0

¿Quiere decir que Sun simplemente olvidó a Socket, ya que presentaron a Closeable? – Mnementh

+1

es difícil de decir ... también ResultSet tiene un método close() pero no se puede cerrar – dfa

+0

Las clases JDBC no deben ser Cierrables, ya que arrojan una excepción diferente. – maaartinus

0

interfaz pública que se pueda cerrar

Un closeable es un origen o destino de los datos que se pueden cerrar. Se invoca el método de cierre para liberar los recursos que tiene el objeto (como abrir los archivos ).

Creo que esto se debe a que el zócalo en sí no es una fuente o un destino de datos, sino que son los inputstream/outputstream asociados con el zócalo.

+0

¿Por qué el voto a favor? – akappa

+0

perche 'sei un pisano :) – dfa

+0

mi sembra una ottima motivazione: D – akappa

0

tengo ni idea, pero supongo que en el momento en que se considera que poseen en las SocketChannel nio lo suficientemente buenos ...

Además, Socket ha existido por mucho tiempo. El nuevo código que comenzó a referirse a él como un Accesable en lugar de llamar a Socket.close() no sería retrocompatible, así que tal vez en el momento de 1.5 (cuando agregaron Cerrar) simplemente no pensaron que valía la pena el esfuerzo teniendo en cuenta que bastantes usuarios aún querrían ser compatibles con el 1.4 y, como no tiene otras interfaces genéricas, rara vez lo tratarán como un Socket.

Supongo que la compatibilidad con versiones anteriores de 1.4 es un problema menor hoy en día, y podría ser por eso que viene en Java7.

"akappa" tiene un otro punto válido en mi humilde opinión.

+1

Pero el argumento de compatibilidad hacia atrás se habría aplicado a InputStream y OutputStream también. –

Cuestiones relacionadas