为什么InputStream和OutputStream实现Closeable而Socket不实现?

时间:2009-07-20 11:21:20

标签: java interface

在方法中看到了这个评论:

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

它会阻止创建包装器匿名内部类,它实现了Closeable,它将close方法委托给Socket实例。

3 个答案:

答案 0 :(得分:8)

在Java5中引入了Closeable,而在JDK 1.0中引入了Socket。在Java7 Socket will be Closeable

修改

只需通过测试close方法的存在,就可以使用反射来关闭Java 4/5/6中的任何“可关闭”对象。使用此技术允许您关闭ResultSet(具有close()方法但不实现Closeable):

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

答案 1 :(得分:0)

  

public interface Closeable

     

Closeable是数据的来源或目的地   可以关闭。关闭方法   被调用以释放资源   对象持有(例如打开   文件)。

我认为这是因为套接字本身不是数据的源或目标,但它们是与套接字关联的输入流/输出流。

答案 2 :(得分:0)

我不知道,但我猜他们当时认为在nio SocketChannel上有足够好的...

此外,Socket已经存在了很长时间。开始将其称为Closeable而不是调用Socket.close()的新代码不会向后兼容,因此可能在1.5时(当他们添加了Closeable时)他们只是认为这不值得努力考虑到相当多的用户仍然希望与1.4兼容,因为它没有其他通用接口,你很少将其视为Socket。

我认为向后兼容1.4现在不是一个问题,这可能就是Java7的原因。

“akappa”有一个IMHO其他有效点。