【发布时间】:2019-12-02 07:07:50
【问题描述】:
我想问一下这个实现是否可以,或者可能有一些问题可能会在以后出现问题。
这个想法是实现一个可与“资源尝试”一起使用的 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();
}
}
}
这个实现好吗? (调用构造函数中的锁...)
如果我的 close 没有引发异常,为什么编译器会强制我添加 catch() 子句?
【问题讨论】:
-
回答你的第二个问题:它迫使你捕捉
Exception,因为你的#lock()方法返回AutoCloseable,其#close()方法确实声明自己抛出提到的例外。由于返回的声明类型是AutoCloseable,编译器不知道 implementation 没有 throws 声明。您的方法必须返回MyReentrantLock以便编译器知道这些信息。
标签: java reentrantlock autocloseable