Этот вопрос противоположен Exception in finalize method и подобным вопросам.
Я создаю класс AutoCloseable
, который представляет серьезные риски, если его не закрыть должным образом. В таком случае я ищу отказоустойчивость, чтобы пользователи случайно не забыли это сделать.
Я понимаю и согласен с тем, что общая лучшая практика заключается в том, чтобы Closeable
s изящно терпели неудачу и делали все возможное, чтобы смягчить ошибку вызывающего, но в этом случае вызывающие не захотят пропустить это. Если вы не согласны с этой идеей концептуально, я буду признателен за ваши отзывы, но в этом случае считайте вопрос академическим упражнением о внутреннем устройстве Java.
То, что я предполагаю, вызывает IllegalStateException
и прерывает пользователя, если вызывается метод finalize()
моего класса, а экземпляр еще не очищен. Однако finalize()
явно проглатывает неперехваченные исключения, что усложняет задачу. Каков наилучший способ вызвать RuntimeException
, который пользователь увидит из метода finalize()
?
Вот демонстрационный класс того, что у меня есть:
public class SeriouslyCloseable implements AutoCloseable {
// We construct an Exception when the class is initialized, so that the stack
// trace informs where the class was created, rather than where it is finalized
private final IllegalStateException leftUnclosed = new IllegalStateException(
"SEVERE: "+getClass().getName()+" was not properly closed after use");
private boolean safelyClosed = false;
@Override
public void close() {
// do work
safelyClosed = true;
}
@Override
protected void finalize() throws IllegalStateException {
if(!safelyClosed) {
// This is suppressed by the GC
throw leftUnclosed;
}
}
}
Примечание. Я также понимаю, что запуск finalize()
не гарантируется, поэтому все, что я реализую вокруг этого метода, не обязательно произойдет. Я все еще хотел бы, чтобы это вероятно произошло, если GC даст нам шанс.