首页 > 编程语言 >JAVA常用类--AutoCloseable接口

JAVA常用类--AutoCloseable接口

时间:2024-03-11 23:23:50浏览次数:35  
标签:AutoCloseable JAVA -- void 发送 消息 msg public

AutoCloseable接口

自动关闭,释放资源机制

在实际的项目开发过程中,一般都有可能连接到一些资源,比如:文件资源、网络资源、数据库资源,在实际项目之中进行资源访问的社会一般有如下几个操作步骤:

不使用AutoCLoseable:

手动定义关闭函数

按照正常的结构设计来讲,当前的程序已经可以满足整个设计上的开发要求,因为有正常的连接同时又可以进行服务器断开访问

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
//接口
interface IMessage{
     public void send(String msg);//发送消息的核心功能
}
//实现接口的类
class NetMassage implements IMessage{
    //无参构造
    //当前的设计为:只要实例化了此类对象就表示要进行消息的发送。则就需要连接网络服务器
    public NetMassage() {
        System.out.println("【连接】连接远程服务器,创建消息的服务通道....");
    }
    @Override
    public void send(String msg) {
        System.out.println("【发送】"+ msg);//模拟数据的发送
    }
    //关闭/释放资源
    public void close(){
        System.out.println("【关闭】网络消息发送完毕,断开服务连接器...");
    }
}
public class Application {
    public static void main(String[] args) {
        //实例化
        NetMassage massage = new NetMassage();//创建消息发送类
        massage.send("发送消息啦!!");
        massage.close();//释放资源
    }
}

运行结果如下:

【连接】连接远程服务器,创建消息的服务通道....
【发送】发送消息啦!!
【关闭】网络消息发送完毕,断开服务连接器...

虽然以上代码已经可以正常实现网络消息的处理模型,但当前的程序本身又存在以下几个问题:

  • 按照正常的设计开发的结构来讲,此时的程序应该是面向接口的开发,应该在接口里面提供所有的核心业务功能
  • 如果此时通过子类获取IMessage接口对象,会发现无法正常的进行close()方法的调用
  • 既然所有的资源在操作完毕之后都需要关闭,那么就可以有一种自动关闭的机制-----AutoCloseable
  • 注意:JDK1.7以上有AutoCloseable

使用AutoCloseable:

必须和异常处理语句一起使用!!!!

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

//接口 继承AutoCloseable类(实现自动关闭)
// AutoCloseable类要和异常捕获一起使用!!!
interface IMessage extends AutoCloseable{
     public void send(String msg);//发送消息的核心功能
}
//实现接口的类
class NetMassage implements IMessage{
    //无参构造
    //当前的设计为:只要实例化了此类对象就表示要进行消息的发送。则就需要连接网络服务器
    public NetMassage() {
        System.out.println("【连接】连接远程服务器,创建消息的服务通道....");
    }
    @Override
    public void send(String msg) {
        System.out.println("【发送】"+ msg);//模拟数据的发送
    }
    //关闭/释放资源
    public void close(){
        System.out.println("【关闭】网络消息发送完毕,断开服务连接器...");
    }
}
public class Application {
    public static void main(String[] args) {
        //AutoCloseable类要和异常处理语句一起使用!!!
        try ( NetMassage massage = new NetMassage();){
            massage.send("发送消息啦!!");
        } catch (Exception e) {
        }
        //massage.close();//释放资源
    }
}

运行结果如下:

【连接】连接远程服务器,创建消息的服务通道....
【发送】发送消息啦!!
【关闭】网络消息发送完毕,断开服务连接器...

在运行过程中有异常抛出也可以自动关闭: send函数修改如下

@Override
    public void send(String msg) {
        if(msg.contains("发送消息")){ //手动抛出异常
            throw new RuntimeException("异常抛出!!");
        }
        System.out.println("【发送】"+ msg);//模拟数据的发送
    }

运行结果如下:

【连接】连接远程服务器,创建消息的服务通道....
【关闭】网络消息发送完毕,断开服务连接器...

通过以上的代码可以发现,必须结合异常处理语句之后才可以使用自动关闭的处理机制,如果在调用的过程之中出现有异常close()方法也是可以正常执行调用的

标签:AutoCloseable,JAVA,--,void,发送,消息,msg,public
From: https://www.cnblogs.com/dxrrrr/p/18067344

相关文章

  • C#堆栈(Stack)
    原文链接:https://www.cnblogs.com/daihaoliulingyi601/p/17947263在C#中,堆栈类表示一个后进先出的对象集合,当你需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。一、堆栈类中的属性下表列出了堆栈类中的一些常用的......
  • 多线程
    多线程的实现java.lang.Thread类代表多线程注意事项启动线程必须是start方法,不是调用run方法不要把主线任务放在启动子线程之前继承Thread/***@authorPickle*@versionV1.0*@date2024/3/1116:43*/publicclassMyThreadextendsThread{@Override......
  • JAVA常用类--Cleaner类
    Cleaner类注意:在JDK1.9以上版本可使用在Java程序中提供有GC的垃圾回收机制,如果发现堆内存不足时一定要进行垃圾回收以释放内存空间但如果某些对象在回收前需要做一些处理,可以通过覆写Object类中的finalize()方法来实现这种回收前的处理finalize()方法的定义:@Deprecated(sin......
  • JAVA常用类--Runtime类
    Runtime类Runtime类描述的是一种运行时,在Java程序执行过程中,所有的java程序都一定要运行在JVM(虚拟机)的进程中有了JVM进程,就需要一种类型可以描述当前进程的相关环境以及与之相关的处理操作,即Java设计出了Runtime类每个JVM的进程中都会自动包含有一个Runtime类的实例化对象,打......
  • WAF和IPS的区别
    简介Web应用防火墙WAF(WebApplicationFirewall)和入侵防御系统IPS(IntrusionPreventionSystem)是网络安全领域中常见的两种安全解决方案,它们有以下区别:1.功能定位WAF主要用于保护Web应用程序免受各种Web攻击(如SQL注入、跨站脚本等)的影响,通过检测和过滤HTTP/HTTPS流量......
  • Docker compose部署Typecho博客系统
    编辑docker-compose.yml文件:services:typecho:image:joyqi/typecho:nightly-php8.2-apacherestart:alwaysports:-8086:80#端口映射,把博客默认的80端口映射到8086端口environment: TYPECHO_DB_HOST:typecho_db#默认值是localhost,docker......
  • 部署测试平台-使用docker安装mysql
    1.拉取mysql5.7镜像:dockerpullmysql:5.72.新建数据库挂载目录:mkdir-p/root/data/mysql5.7/conf   配置文件mkdir-p/root/data/mysql5.7/data   数据库数据目录mkdir-p/root/data/mysql5.7/log   数据库日志3.把配置文件my.cnf放到/root/data/m......
  • 今日总结
        importjava.util.*;publicclasstest{staticScannerin=newScanner(System.in);publicstaticvoidinput(inta[],intn){//数组输入for(inti=0;i<n;i++){a[i]=in.nextInt();}}publicstaticin......
  • yum总纲
    yum总纲yum源搭建首先本文档讲解两种搭建方式,第一有网络环境和第二种无网络环境。第一种:有网络环境首先进入系统执行:以下命令,获取网络源wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repowget-O/etc/yum.repos.d/epel.repohttp:......
  • base16编码和解码-支持中文
     这是一个base16编码/解码的方法。而且支持中文的编码和解码。 代码由chatgpt-3.5生成:#include<iostream>#include<string>conststd::stringbase16="0123456789ABCDEF";voidBase16Encode(conststd::string&data,std::string&out){for(unsigned......