为什么ServerSocket.setSocketFactory是静态的?

时间:2012-08-16 07:41:40

标签: java serversocket

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

更新 为什么这是一个麻烦似乎有些混乱。这造成的问题是它迫使我在整个应用程序中使用相同的工厂。如果我想在一个地方使用默认的SocketImpl而在另一个地方使用自定义的SocketImpl怎么办?如果不诉诸一些丑陋的反思黑客,就无法做到这一点,因为工厂一旦设置就无法改变。我也无法让我的工厂创建默认实现,因为SocksSocketImpl是包私有。

6 个答案:

答案 0 :(得分:4)

  

SocketImpl是一个为其提供接口的抽象类   自定义套接字实现。 SocketImpl的子类不是   旨在明确实例化。相反,它们是由a创建的   SocketImplFactory。这种设计的动机是允许你   更改整个应用程序使用的默认套接字类型   调用Socket.setSocketImplFactory(),使其不必   重写所有网络代码。自定义插座是必需的   SSL和防火墙隧道等功能。不幸的是,全球   setSocketImplFactory()的本质是相当有限的,因为它没有   允许您在一个插槽中使用多种类型的套接字   应用。您可以通过继承Socket并使用来解决这个问题   引入的受保护的Socket(SocketImpl)构造函数   JDK 1.1。

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

答案 1 :(得分:1)

看来,使用这个setter static会使它更容易使用,因为不需要ServerSocket实例,它可以让你设置Socket工厂而不需要引用它。我认为使这个setter全局化使得它实际上更容易实现,为什么它对你来说很麻烦?

答案 2 :(得分:1)

查看Constructor of ServerSocket

  

如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl方法以创建实际的套接字实现。否则会创建一个“普通”套接字。

因此它必须是静态的,因为如果您希望在创建套接字的新实例时使用它,则需要设置Factory。

答案 3 :(得分:1)

这非常恶心,但你可以创建一个DelegatingSocketFactory来查看调用它的调用堆栈,并创建一个SocksSocketImpl(使用反射来整理可访问性),或者使用Ice4J。这算是一个反思黑客!

答案 4 :(得分:0)

您是否希望非静态工厂知道如何神奇地实例化您的自定义类?

答案 5 :(得分:0)

在我看来,这似乎是Factory Pattern的经典案例,其中您提供了一个自定义工厂对象,其中的设置决定了如何创建某个类的实例。将工厂操纵为静态的方法是完全合理的,因为工厂充当“元对象”,指导其他对象的创建。

从设计的角度来看,每个实例的工厂都没有意义。每个实例拥有一个不同的工厂有什么意义?您是否计划从其他实例创建ServerSocket的实例?如果您需要不同的设置,您每次都必须提供不同的工厂。