Это безопасный, правильный и эквивалентный обходной путь для классов, которые не реализуют интерфейс AutoCloseable? - PullRequest
8 голосов
/ 12 октября 2019

Справочная информация: я использую класс Java InitialDirContext для доступа к каталогам LDAP. К сожалению , он не реализует интерфейс AutoCloseable, поэтому его нельзя использовать в блоки try-with-resources .

Вот исходный код, который я написал:( вдохновленный этим ответом )

final Properties props = new Properties();
// Populate 'props' here.
final InitialDirContext context = new InitialDirContext(props);
Exception e0 = null;
try {
    // use 'context' here
}
catch (Exception e) {
    // Only save a reference to the exception.
    e0 = e;
    // Why re-throw?
    // If finally block does not throw, this exception must be thrown.
    throw e;
}
finally {
    try {
        context.close();
    }
    catch (Exception e2) {
        if (null != e0) {
            e0.addSuppressed(e2);
            // No need to re-throw 'e0' here.  It was (re-)thrown above.
        }
        else {
            throw e2;
        }
    }
}

Является ли это безопасной, правильной и эквивалентной заменой?

try (final AutoCloseable dummy = () -> context.close()) {
    // use 'context' here
}

I думаю ответ - да, но я хочу подтвердить. Я попробовал поискать в Google по этому шаблону, но ничего не нашел. Это так просто! Таким образом, я подозреваю, что это может быть не так.

Редактировать: Я только что нашел этот ответ с похожим шаблоном.

...