Я хотел спросить, в порядке ли эта реализация, или, может быть, есть какие-то проблемы, которые позже могут стать проблематичными.
Идея состоит в том, чтобы реализовать класс ReentrantLock, который можно использовать с «попробовать с ресурсами», а это означает, что он должен реализовать интерфейс AutoCloseable.
Кроме того, я хотел спросить, почему в методе main компилятор выдает, что я должен добавить предложение catch, потому что мой метод close (в MyReentrantLock) не генерирует исключение.
import java.util.concurrent.locks.ReentrantLock;
public class Ex09ReentrantLock {
@SuppressWarnings("serial")
public static class MyReentrantLock extends ReentrantLock implements AutoCloseable{
public MyReentrantLock() {
super();
lock();
}
@Override
public void close(){
unlock();
}
}
public static AutoCloseable lock() {
var locker = new MyReentrantLock(); //lock() is called in the constructor
return locker; //implements AutoCloseable
}
//Demo
public static void main(String[] args) {
//try(ReentrantLock lock = new ReentrantLock()){} = compiler error
try(var locker = lock();){
//some work...
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Подходит ли эта реализация? (вызвать блокировку в конструкторе...)
Почему компилятор заставляет меня добавлять предложение catch(), если мое закрытие не вызывает исключение?
Exception
, потому что ваш метод#lock()
возвращаетAutoCloseable
, чей метод#close()
делает объявляет себя выдающим упомянутое исключение. Поскольку возвращаемый объявленный тип —AutoCloseable
, компилятор понятия не имеет, что реализация не имеет объявления throws. Ваш метод должен будет вернутьMyReentrantLock
, чтобы компилятор знал такую информацию. - person Slaw   schedule 02.12.2019