開發與維運

使用AutoCloseable实现资源自动关闭 | 带你学《Java语言高级特性》之十七

上一篇:让String拥有变化之力 | 带你学《Java语言高级特性》之十六
【本节目标】
通过阅读本节内容,你将先实现手动关闭资源,并尝试结合异常处理机制使用AutoCloseable实现资源的自动关闭,对此类逻辑有一个初步的认识。

AutoCloseable接口

AutoCloseable主要是用于日后进行资源开发的处理上,以实现资源的自动关闭(释放资源),例如:在以后进行文件、网络以及数据库开发的过程中,由于服务器的资源有限,所以使用之后一定要关闭资源,这样才可以被更多的使用者所使用。
下面为了更好的说明资源的问题,将通过一个消息的发送处理来完成。
范例:手工实现资源处理

interface IMessage {
    public void send();    //消息发送
}
class NetMessage implements IMessage {        //实现消息的处理机制
    private String msg;
    public NetMessage(String msg) {
        this.msg = msg;
    }
    @Override
    public void send() {
        if (this.open()) {
            System.out.println("【*** 发送消息 ***】" + this.msg);
        }
    }
    public boolean open() {      //获取资源连接
        System.out.println("【OPEN】获取消息发送连接资源") ;
        return true ;
    }
    public void close() {
        System.out.println("【CLOSE】关闭消息发送通道") ;
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) {
         NetMessage nm = new NetMessage("www.mldn.cn") ;         //定义要发送的处理
   nm.send() ;             //消息发送
          nm.close() ;           //关闭连接
    }  
}

image.png
图一 手工实现资源处理

此时有人说,既然所有的资源完成处理后都必须进行关闭操作,那么能否实现一种自动关闭呢?在这样的要求下,由此推出了AutoCloseable访问接口,这个接口是在JDK1.7的时候提供的,并且该接口只提供有一个方法:

关闭方法:public void close() throws Exception;

image.png
图二 AutoCloseable

要想实现自动关闭处理,除了要使用AutoCloseable外,还需要结合异常处理语句才可以正常调用。
范例:实现自动关闭处理

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        try (IMessage nm = new NetMessage("www.mldn.cn")){
            nm.send();      //消息发送
        }catch (Exception e){}

    }
}
interface IMessage extends AutoCloseable{
    void send();     //消息发送
}
class NetMessage implements IMessage {      //实现消息的处理机制
    private String msg;
    public NetMessage(String msg) {
        this.msg = msg;
    }
    @Override
    public void send() {
        if (this.open()) {
            System.out.println("【*** 发送消息 ***】" + this.msg);
        }
    }
    public boolean open() {       //获取资源连接
        System.out.println("【OPEN】获取消息发送连接资源");
        return true;
    }
    @Override
    public void close() throws Exception{
        System.out.println("【CLOSE】关闭消息发送通道");
    }
}

image.png
图三 实现自动关闭处理

在以后的章节之中会接触到资源的关闭问题,往往都会见到AutoCloseable接口的使用。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

更多Java面向对象编程文章查看此处

Leave a Reply

Your email address will not be published. Required fields are marked *