【发布时间】:2017-11-20 15:04:10
【问题描述】:
我在 github 上找到了以下代码:
public class DummySSLSocketFactory extends SSLSocketFactory {
private static final Logger LOG = LoggerFactory.getLogger(DummySSLSocketFactory.class);
private SSLSocketFactory factory;
public DummySSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[] {new DummyTrustManager()};
sslContext.init(null, trustManagers, new java.security.SecureRandom());
factory = sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeCamelException("Error creating DummySSLSocketFactory: " + e.getMessage(), e);
}
}
/**
* Must provide this getDefault operation for JavaMail to be able to use this factory.
*/
public static SocketFactory getDefault() {
LOG.warn("Camel is using DummySSLSocketFactory as SSLSocketFactory (only to be used for testing purpose)");
return new DummySSLSocketFactory();
}
public String[] getDefaultCipherSuites() {
return factory.getDefaultCipherSuites();
}
public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
return factory.createSocket(socket, host, port, autoClose);
}
public Socket createSocket(String host, int port) throws IOException {
return factory.createSocket(host, port);
}
public Socket createSocket(String host, int port, InetAddress localAddress, int localPort)
throws IOException {
return factory.createSocket(host, port, localAddress, localPort);
}
public Socket createSocket(InetAddress host, int port) throws IOException {
return factory.createSocket(host, port);
}
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
throws IOException {
return factory.createSocket(address, port, localAddress, localPort);
}
public Socket createSocket() throws IOException {
// must have this createSocket method
return factory.createSocket();
}
}
类似的实现被广泛用于不同的项目。
我试图弄清楚同时使用继承和组合的目的是什么。看起来只要有一个返回 sslContext.getSocketFactory(); 结果的工厂方法就足够了,因为它根本不扩展类。
【问题讨论】:
-
也许他们不能只使用工厂方法,因为他们正在使用某种基于反射的框架,需要一个具有可访问构造函数的类,或者他们可能需要显式创建一个自定义子类
SSLSocketFactory出于某种原因。或者他们可能想为每个方法添加日志记录功能,但他们还没有完成类的实现。在这种特殊情况下很难确定。
标签: java inheritance composition sslcontext