AutoCloseable
今天读源码读到了这个接口,就是想知道这个是干嘛的,看名字的意思是可自动关闭的。
点开的源码发现这个接口只有一个方法。
package java.lang;
public interface AutoCloseable {
/**
* 关闭此资源,放弃任何底层资源。在try-with-resources语句管理的对象上自动调用此方法。
* 虽然这个接口方法被声明为抛出Exception,但强烈建议实现者声明close方法的具体实现,
* 以抛出更具体的异常,或者如果close操作不会失败,则根本不抛出异常。
* 关闭操作可能失败的情况需要实现者仔细注意。强烈建议在抛出异常之前放弃底层资源并在内部将资源标记为关闭。
* close方法不太可能被多次调用,因此这确保了及时释放资源。此外,它减少了资源包装或被其他资源包装时可能出现的问题。
* 强烈建议该接口的实现者不要让close方法抛出InterruptedException异常。
* 此异常与线程的中断状态交互,如果抑制InterruptedException,则很可能发生运行时错误行为。
* 更一般地说,如果它会导致异常被抑制的问题,则使用AutoCloseable。关闭方法不应该抛出它。
* 注意,与java.io的close方法不同。可封闭的,这种封闭方法并不要求是幂等的。换句话说,与Closeable不同,
* 多次调用这个close方法可能会有一些可见的副作用。关闭,如果调用多次,则要求关闭没有效果。然而,
* 这个接口的实现者被强烈鼓励使其接近的方法幂等。
*/
void close() throws Exception;
}
实现这个接口的目的就是在操作资源的时候,使用try-with-resources管理资源,当异常或者正常退出的时候资源都能得到有效的释放。
写了一个小列子
package com.nw.jdktest;
public class AutoCloseObject implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("我是一个可以自动释放资源的类");
}
public void callFun() {
System.out.println("我正在叫");
}
//测试一下这个类
public static void main(String[] args) {
//可以自动释放这个类的资源
try (AutoCloseObject autoCloseObject = new AutoCloseObject()) {
autoCloseObject.callFun();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("方法执行完毕");
}
}
}
//最后的结果
我正在叫
我是一个可以自动释放资源的类
方法执行完毕