2009-07-20 30 views
8

見過的方法,此評論:爲什麼InputStream和OutputStream實現Closeable並且Socket沒有?

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

這將阻止它實現了可關閉的包裝匿名內部類的創建,並代理其Socket實例close方法。

+1

爲什麼不問這個問題?相反,你引用了一條評論,評論包含了難以閱讀的問題。 – Buttons840 2011-09-02 18:44:26

+0

@ Buttons840我認爲這個問題顯然是在標題中提出的。正文包含說明。 – 2011-09-17 18:36:19

回答

8

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

EDIT

可以使用反射,以便簡單地通過測試方法密切的存在以關閉在Java中4/5/6任何「可封閉」對象。使用這種技術允許你關閉,也就是說,一個結果集(具有close()方法,但沒有實現可關閉):

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

公共接口可關閉

可閉合是源或可以關閉數據 的目的地。調用close方法 以釋放該對象所持有的資源(如打開 文件)。

我想這是因爲插座本身不是源或數據的目的,但它們與插座相關的的InputStream/OutputStream中。

+0

爲什麼downvote? – akappa 2009-07-20 11:59:04

+0

perche'sei un pisano :) – dfa 2009-07-20 12:01:09

0

我不知道,但我想在他們認爲有它的NIO的SocketChannel不夠好時間...

此外,插座已經存在了很長一段時間。開始將其稱爲Closeable而不是調用Socket.close()的新代碼不會向後兼容,因此可能在1.5時(他們添加了Closeable時),他們不認爲值得考慮不少用戶仍然希望與1.4兼容,並且因爲它沒有其他通用接口,所以很少將它看作是Socket的其他任何接口。

我認爲與1.4的向後兼容性不像現在這個問題那麼可能是Java7中出現的原因。

「akappa」有一個恕我直言的其他有效的點。

相關問題