Подтвердить что ты не робот

Почему ServerSocket.setSocketFactory статичен?

Я пытаюсь использовать пользовательский SocketImpl с SSL в Java. Из-за этого мне нужно установить сокет ServerSocket factory. Теперь я заметил, что он статический, что создает для меня некоторые проблемы, поскольку я хочу предоставить ему некоторые параметры, которые различаются в каждом экземпляре ServerSocket. Кто-нибудь знает, почему это статично? Для меня это похоже на ненужное ограничение, которое вводит в ваше приложение более глобальное состояние.

Обновление Кажется, есть некоторая путаница в том, почему это хлопот. Проблема заключается в том, что он заставляет меня использовать один и тот же factory для всего приложения. Что делать, если я хочу использовать SocketImpl по умолчанию в одном месте и пользовательский в другом? Это невозможно сделать, не прибегая к некоторым уродливым взломам отражения, потому что factory не может быть изменен после его установки. Я также не могу создать свою конструкцию по умолчанию factory, потому что SocksSocketImpl является закрытым пакетом.

4b9b3361

Ответ 1

SocketImpl - абстрактный класс, предоставляющий интерфейс для настройка реализаций сокетов. Подклассы SocketImpl не являются предназначенный для явного инстанцирования. Вместо этого они создаются SocketImplFactory. Мотивация для этого проекта - позволить вам измените тип сокета по умолчанию, используемый всем приложением, вызывая Socket.setSocketImplFactory(), что делает ненужным перепишите весь свой сетевой код. Пользовательские сокеты необходимы для таких как SSL и туннелирование брандмауэра. К сожалению, глобальная характер setSocketImplFactory() довольно ограничен, поскольку он не позволяют использовать несколько типов сокетов в одном выражение. Вы можете обойти это, подклассифицируя Socket и используя защищенный конструктор Socket (SocketImpl), который был введен в JDK 1.1.

Ссылка: http://www.devx.com/tips/Tip/26363

Ответ 2

Мне кажется, что использование этого статического статора упрощает его использование, потому что нет необходимости иметь экземпляр ServerSocket и он позволяет устанавливать Socket factory без ссылки на него. Я думаю, что сделать этот сеттер глобальным, сделать его фактически проще реализовать, почему это хлопот для вас?

Ответ 3

Посмотрите конструктор ServerSocket

Если приложение задало серверный сокет factory, этот метод factory createSocketImpl вызывается для создания фактической реализации сокета. В противном случае создается "простой" сокет.

Таким образом, он должен быть статическим, потому что необходимо установить factory, если вы хотите, чтобы он использовался, когда вы создаете новый экземпляр сокета.

Ответ 4

Это довольно отвратительно, но вы можете создать DelegatingSocketFactory, который просматривает стек вызовов у того, кто его вызвал, и либо создает SocksSocketImpl (используя отражение, чтобы разобраться в доступности), либо использует Ice4J. Это считается отражением взлома!

Ответ 5

Ожидаете ли вы, что нестатический factory знает, как магически создать экземпляр своего класса?

Ответ 6

Мне кажется, что это классический случай Factory Pattern, в котором вы предоставляете пользовательский объект factory с настройками, которые определяют, как создается экземпляр определенного класса. Совершенно очевидно, что методы, управляющие фабриками, статичны, поскольку factory действует как "метаобъект", направляя создание других объектов.

Наличие factory каждого экземпляра просто не имеет смысла с дизайнерской точки зрения. Какой смысл иметь другой factory для каждого экземпляра? Планируете ли вы создавать экземпляры ServerSocket из других экземпляров? Если вам нужны разные настройки, вам просто нужно каждый раз предлагать разные factory.