Я наткнулся на некоторый код вызова JMS, который инициализирует сеанс JMS внутри своего конструктора.Вызывающий код реализует интерфейс ExceptionListener и передает ссылку на this объекту фабрики соединений, как показано ниже:
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, учитывая, что объект еще не полностью построен.Я столкнулся с похожим вопросом , в котором я читал статью о том, что IBM не публикует this во время строительства .Хотя я согласен с их аргументацией, я не уверен, применима ли она в этом случае, поскольку единственное, что делает прослушиватель исключений, это регистрация через статический и последний член.Является ли приведенный выше код безопасным (игнорируя, что кто-то еще испытывает желание изменить метод прослушивания исключений для использования некоторого состояния экземпляра объекта)?