Почему InputStream и OutputStream реализуют Closeable, а Socket - нет? - PullRequest
8 голосов
/ 20 июля 2009

видели этот комментарий в методе:

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

Это предотвратит создание анонимного внутреннего класса-оболочки, который реализует Closeable, который делегирует свой метод close экземпляру Socket.

Ответы [ 3 ]

8 голосов
/ 20 июля 2009

Closeable был представлен в Java5, тогда как Socket был представлен в JDK 1.0. В сокет Java7 будет закрыт .

EDIT

Вы можете использовать отражение, чтобы закрыть любой «закрываемый» объект в Java 4/5/6, просто протестировав наличие метода close. Использование этого метода позволяет вам закрыть, скажем, 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");
    }   
}
0 голосов
/ 20 июля 2009

Понятия не имею, но, думаю, в то время, когда они считали, что он достаточно хорош для nio SocketChannel ...

Кроме того, Socket существует уже давно. Новый код, который начал называть его Closeable вместо вызова Socket.close (), не будет обратно совместимым, поэтому, возможно, в момент 1.5 (когда они добавили Closeable) они просто не думали, что это стоит усилий, учитывая, что Многие пользователи по-прежнему хотят быть совместимыми с 1.4, и поскольку у него нет других универсальных интерфейсов, вы редко относитесь к нему как к чему-либо, кроме Socket.

Я полагаю, что обратная совместимость с 1.4 в настоящее время не так важна, поэтому может появиться в Java7.

"akappa" имеет ИМХО другой действительный пункт.

0 голосов
/ 20 июля 2009

открытый интерфейс Closeable

Закрываемый является источником или местом назначения данных это может быть закрыто. Закрытый метод вызывается для освобождения ресурсов, которые объект держит (например, открыт файлы).

Я думаю, это потому, что сам сокет не является источником или местом назначения данных, но они являются входным потоком / выходным потоком, связанным с сокетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...