1

在我的代码中,根据布尔标志,我应该决定是否与 SSL 套接字握手。我使用 SSLSocketFactory 创建套接字,这是从官方 Javadoc 获取的 createSocket 方法的签名。

abstract Socket createSocket(Socket s, String host, int port, boolean autoClose)

在这里返回 aSocket而不是a 似乎是一个明确的设计选择SSLSocket,这意味着使用此方法的类不需要知道Socketa 是 a SSLSocket

但是,如果我必须握手,我必须向下转换它,因为方法

  public abstract void startHandshake() throws java.io.IOException;

在 SSLSocket 类上定义。

SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket( getApiServerAddress(), getPort() );

三个可能的答案哪个是正确的?

  • 库中的这种设计模式表明您不应该直接调用 startHandShake(),而是调用 Socket 类上的某个方法,该方法将调用 startHandShake()。Socket 类的这个方法是什么?而且,如果是这样,为什么 startHandShake() 是公开的?

  • 图书馆设计得很差。

  • 我没有以正确的方式创建 SSLSocket。

4

1 回答 1

3

因为createSocket方法是继承自SocketFactory. 无法覆盖结果类型。

可能有一种使用泛型的方法,但这会破坏现有的 API 和所有现有的代码。

于 2013-08-14T08:35:56.357 回答