在方法中看到了这个评论:
//I wonder why Sun made input and output streams implement Closeable and left Socket behind
它会阻止创建包装器匿名内部类,它实现了Closeable,它将close方法委托给Socket实例。
答案 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其他有效点。