首页 > 解决方案 > 在构造函数中传递 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 关于在施工期间不发布内容的文章。虽然我同意他们的推理,但我不确定它是否适用于这种情况,因为异常侦听器所做的唯一事情就是通过静态和最终成员进行记录。上面的代码是否安全(忽略其他人试图更改异常侦听器方法以使用对象的某些实例状态)?

标签: javaconstructor

解决方案


这实际上是不安全的发布,理论上另一个对象可以看到这个处于不一致状态的对象。

也就是说,虽然这不是一个好的模式(这里只是为了演示ExceptionListener),但构造函数的逻辑表明该类实际上在this引用转义时已完全构造(因为它没有什么可构造的) ,所以在这种情况下,没有什么可以出错的。


推荐阅读