java - 在构造函数中传递 this
问题描述
我遇到了一些在其构造函数中初始化 JMS 会话的 JMS 调用代码。调用代码实现了 ExceptionListener 接口,并将对此的引用传递给连接工厂对象,如下所示:
public class JmsCode implements ExceptionListener {
private static final Logger logger = LoggerFactory.getLogger(JmsCode.class);
public JmsCode(String url, String username, String password, String trustStorePath, char[] trustStorePassword) throws JMSException {
ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory(url);
connectionFactory.setUserName(username);
connectionFactory.setPassword(password);
connectionFactory.setTrustStore(trustStorePath);
connectionFactory.setTrustStorePassword(new String(trustStorePassword));
connectionFactory.setExceptionListener(this);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}
@Override
public void onException(JMSException e) {
logger.error("Unexpected JMS exception caught", e);
}
}
鉴于对象尚未完全构造,我想知道从 JmsCode 构造函数传递对this的引用是否安全。我遇到了一个类似的问题,该问题让我阅读了IBM 关于在施工期间不发布此内容的文章。虽然我同意他们的推理,但我不确定它是否适用于这种情况,因为异常侦听器所做的唯一事情就是通过静态和最终成员进行记录。上面的代码是否安全(忽略其他人试图更改异常侦听器方法以使用对象的某些实例状态)?
解决方案
这实际上是不安全的发布,理论上另一个对象可以看到这个处于不一致状态的对象。
也就是说,虽然这不是一个好的模式(这里只是为了演示ExceptionListener
),但构造函数的逻辑表明该类实际上在this
引用转义时已完全构造(因为它没有什么可构造的) ,所以在这种情况下,没有什么可以出错的。
推荐阅读
- flutter - 是否有可能以字节为单位获取对象的大小,尤其是列表
或地图 ? - testing - 通过命令在 TestCafé Studio 中运行测试
- c - 无法在共享库中附加共享内存
- python - 从nodejs产生的python进程读取输出的问题
- php - 从WordPress中的最后一篇文章中获取第一张图片
- c - 计算C中一个句子中单词的出现次数
- c# - Microsoft Office interop Excel 中是否有任何选项隐藏保存对话框?
- javascript - 如何使用一些可选模块构建多包节点模块
- javascript - 如何在 Jquery 选择器中使用变量
- google-apps-script - 问:如何将 URL 域列表转换为完整 url