为什么ServerSocket.setSocketFactory是静态的?

2022-09-04 04:20:08

我正在尝试在Java中使用带有SSL的自定义SocketImpl。因此,我需要设置ServerSocket的套接字工厂。我现在注意到它是静态的,这给我带来了一些麻烦,因为我想为每个ServerSocket实例中的一些不同的参数提供一些参数。有谁知道让它保持静态背后的原因吗?对我来说,这感觉就像是一个不必要的约束,只会在你的应用中引入更多的全局状态。

更新对于为什么这是一个麻烦,似乎有些困惑。这会产生的问题是,它迫使我在整个应用程序中使用相同的工厂。如果我想在一个地方使用默认的SocketImpl,而在另一个地方使用自定义的SocketImpl,该怎么办?如果不诉诸一些丑陋的反射技巧,就无法做到这一点,因为工厂一旦设置好就无法更改。我也不能让我的工厂创建默认实现,因为SocksSocketImpl是包私有的。


答案 1

SocketImpl 是一个抽象类,它提供了一个用于自定义套接字实现的接口。SocketImpl 的子类不打算显式实例化。相反,它们是由SocketImplFactory创建的。此设计的动机是允许您通过调用 Socket.setSocketImplFactory() 来更改整个应用程序使用的默认套接字类型,从而无需重写所有网络代码。自定义套接字对于 SSL 和防火墙隧道等功能是必需的。不幸的是,setSocketImplFactory() 的全局性质相当有限,因为它不允许你在单个应用程序中使用多种类型的套接字。您可以通过对 Socket 进行子类化并使用 JDK 1.1 中引入的受保护的 Socket(SocketImpl) 构造函数来解决此问题。

参考资料:http://www.devx.com/tips/Tip/26363


答案 2

对我来说,似乎具有此 setter 静态设置器使其更易于使用,因为不需要具有 ServerSocket 的实例,并且它允许您设置 Socket factory 而无需引用它。我认为使这个 setter 全球化实际上更容易实现,为什么它对你来说很麻烦?


推荐