今天发一个短点的技术博文,专门介绍一下AutoCloseable接口。
细心的小伙伴在学习IO流的时候会发现,输入输出流实现了Closeable接口,Closeable接口继承了AutoClose接口(jdk1.7之后),见名知意,此接口应该是用来实现自动关闭资源的功能,好的,查看一下API:
API对AutoClose接口的解释: 可以保存资源的对象(如文件或套接字句柄),直到它关闭。 AutoCloseable对象的close()方法在退出已在资源规范头中声明对象的try -with-resources块时自动调用。 这种结构确保迅速释放,避免资源耗尽异常和可能发生的错误。
本来,我以为这个接口没什么可说的,实现了此接口的子类就能在最后的时候资源关闭,但是!!!它自动在哪里?什么时候会自动调用close()方法呢?很简单,将从创建对象到最后使用完毕的代码放到一个“容器”中,当执行完容器最后一句后,系统判断到这个对象已经用完,可以调用close方法了,在Java中是通过try-with-resources来实现的。下面介绍基本写法:
第一步:定义类,实现AutoCloseable接口
/**
此类类似于IO流,需要在使用后释放资源
*/
class AutoClose implements AutoCloseable {
public void test() {
System.out.println("测试");
}
@Override
public void close() throws Exception {
System.out.println("关闭");
}
}
第二步:使用语法糖
public static void main(String[] args) {
/* 错误示范 */
AutoClose autoClose1 = new AutoClose();
autoClose1.test();
/*
虽然你用完了该方法,但系统不知道,
所以,这里不会自动关闭,需要手动调用关闭方法
*/
try {
autoClose1.close();
} catch (Exception e) {
e.printStackTrace();
}
/* 正确用法:资源对象实例化放在try的括号中,内部写内容 */
try (AutoClose autoClose2 = new AutoClose()) {
/* 这里面相当于容器,执行完容器内容后,自动调用关闭方法 */
autoClose2.test();
} catch (Exception e) {
e.printStackTrace();
}
}
执行结果就是,语法糖中的内容执行后,自己默默地调用了autoClose2的close方法。
感觉能够用于JDBC系列工具类中,具体用法还在进一步挖掘。