我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java两大工具库Commons和Guava如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java两大工具库Commons和Guava如何使用

本文小编为大家详细介绍“Java两大工具库Commons和Guava如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java两大工具库Commons和Guava如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

正文

除了操作集合、限流和缓存,Guava还有另一个隐秘的功能:事件总线EventBus机制——是发布-订阅模式的实现,不需要显式地注册回调——比观察者模式更灵活。

EventBus是在单体架构内实现松耦合的一种很好的手段,通过它可以实现与业务逻辑无关的事件监听和消费。Guava提供的事件总线EventBus分为两种:

  • 同步事件EventBus,主要用于单线程环境;

  • 异步事件AsyncEventBus,主要用于多线程环境。

可以稍稍回顾一下观察者模式。

在支付系统的设计模式中,当完成交易后,需要给用户发送通知时就使用到了观察者模式,怎么做的呢?

  • 定义账户观察者接口及其子接口支付观察者和积分观察者;

  • 支付抽象类实现这两个子接口,具体支付类阿里支付、微信支付和余额支付,也都分别实现这两个子接口;

  • 在账户类中加入观察者接口列表,并增加注册、删除和调用观察者接口的方法;

  • 在支付时将各类支付方式注册到账户的观察者列表中;

  • 在交易完成后,就可以调用账户的调用观察者接口的方法,实现回调。

Java两大工具库Commons和Guava如何使用

观察者模式的实现稍嫌麻烦。

既然用观察者模式实现比较麻烦,那不妨换个思路,用Guava EventBus来实现,而且无需继承任何接口。调用、发送回调通知同样也很简单,用EventBus把支付回调再来实现一遍。

先定义观察者

public class AliPayObserver {    // 标记当前订阅者是线程安全的,支持并发接收消息    @AllowConcurrentEvents    @Subscribe    public void pay(Account account) {        if (account.getName().equalsIgnoreCase("ALI")) {            System.out.println("支付宝 >>>>>> 已付款");            System.out.println(account.getMessage());        }    }}
public class WeixinObserver {    // 标记当前订阅者是线程安全的,支持并发接收消息    @AllowConcurrentEvents    @Subscribe    public void pay(Account account) {        if (account.getName().equalsIgnoreCase("WEIXIN")) {            System.out.println("微信 >>>>>> 已付款");            System.out.println(account.getMessage());        }    }}
public class YuePayObserver {    // 标记当前订阅者是线程安全的,支持并发接收消息    @AllowConcurrentEvents    @Subscribe    public void pay(Account account) {        if (account.getName().equalsIgnoreCase("YUE")) {            System.out.println("余额 >>>>>> 已付款");            System.out.println(account.getMessage());        }    }}

然后定义账户类

public class Account {    private String name;    private double amount;    private Date date;    public Account(String name, double amount, Date date) {        this.name = name;        this.amount = amount;        this.date = date;    }    public String getName() {        return name;    }    public String getMessage() {        StringBuilder sb = new StringBuilder();        sb.append("账户:").append(this.name).append(", ");        sb.append("金额:").append(amount).append(", ");        sb.append("日期:").append(date);        return sb.toString();    }}

最后实现事件总线

public class EventBusTest {    // 回调通知    public static void notifyObserver() {        EventBus bus = new EventBus();        AliPayObserver ali = new AliPayObserver();        WeixinObserver weixin = new WeixinObserver();        YuePayObserver yue = new YuePayObserver();        bus.register(ali);        bus.register(weixin);        bus.register(yue);        Account account1 = new Account("ALI", 1.6, new Date());        bus.post(account1);        Account account2 = new Account("WEIXIN", 2.2, new Date());        bus.post(account2);        Account account3 = new Account("YUE", 3, new Date());        bus.post(account3);    }    public static void main(String[] args) throws InterruptedException {        notifyObserver();    }}

运行main方法,可以看到,尽管没有显式声明观察者接口,但通过一个@Subscribe注解,就完成了方法回调。这就是EventBus比观察者模式要灵活强大的地方。

如果还不满足,那就再来一个例子。

创建观察者接口和具体观察者

public interface HouseWork {    public void dry();}
public class Woman implements HouseWork {    @Override    public void dry() {        System.out.println("可以晾衣服了");    }}

创建Subject:

public class WashingMachine {    private Vector<HouseWork> vector = new Vector<>();    public void register(HouseWork work) {        vector.add(work);    }    public void unregister(HouseWork work) {        vector.remove(work);    }    public void notifyObserver() {        for (HouseWork work : vector) {            work.dry();        }    }    public static void main(String[] args) throws InterruptedException {        // 洗衣机        WashingMachine machine = new WashingMachine();        // 女主人        Woman woman = new Woman();        // 洗衣机让女主人成为自己的观察者        machine.register(woman);        System.out.println("将衣服放到洗衣机。。。");        System.out.println("买菜、遛娃中。。。");        Thread.sleep(3000);        // 通知观察者(女主人),衣服洗完了        machine.notifyObserver();    }}

用EventBus把刚才家庭妇女做家务的例子再来做一遍(现在换成家庭妇男):

public class Man {    @Subscribe    public void dry(Sheet sheet) {        System.out.println("可以晾 " + sheet.getName() + " 床单了");    }}
public class EventBusTest {    // 回调通知    public static void notifyObserver() {        EventBus bus = new EventBus();        Man man = new Man();        bus.register(man);        bus.post(new Sheet("富安娜"));    }    public static void main(String[] args) {        notifyObserver();    }}
public class Sheet {    private String name;    public Sheet(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

运行main方法,可以看到和之前一样的效果。事件总线的一个缺点是,回调接口必须有参数,这并不友好。

读到这里,这篇“Java两大工具库Commons和Guava如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java两大工具库Commons和Guava如何使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java两大工具库Commons和Guava如何使用

本文小编为大家详细介绍“Java两大工具库Commons和Guava如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java两大工具库Commons和Guava如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习
2023-07-05

Java两大工具库Commons和Guava使用示例详解

这篇文章主要为大家介绍了Java两大工具库Commons和Guava使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-07

如何在Java中使用Hutool工具类库

这篇文章将为大家详细讲解有关如何在Java中使用Hutool工具类库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HuTool 中的一些常用工具类我们引入这个工具类很简单,直接在 Mavan
2023-06-14

IDEA中如何使用SQL和数据库工具

在IDEA中可以使用SQL和数据库工具来连接和操作数据库,以下是操作步骤:打开IDEA,点击菜单栏的View -> Tool Windows -> Database,打开数据库工具窗口。在数据库工具窗口中,点击加号按钮,选择数据库类型并填写
IDEA中如何使用SQL和数据库工具
2024-04-30

如何使用工具和库来优化C++程序?

现代 c++++ 开发中,利用工具和库进行优化至关重要。valgrind、perf 和 lldb 等工具可识别瓶颈、测量性能并进行调试。eigen、boost 和 opencv 等库可提升线性代数、网络 i/o 和计算机视觉等领域的效率。例
如何使用工具和库来优化C++程序?
2024-05-08

Java如何使用Fiddler抓包工具

这篇文章将为大家详细讲解有关Java如何使用Fiddler抓包工具,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一. 下载安装Fiddler这里强烈建议大家在官网上下载安装,在此附上链接https://w
2023-06-29

如何在Java中使用Collections工具类

本篇文章为大家展示了如何在Java中使用Collections工具类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数
2023-06-14

Java并发工具类Future如何使用

这篇文章主要讲解了“Java并发工具类Future如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发工具类Future如何使用”吧!前言Future是一个接口类,定义了5个方
2023-06-30

如何在Java中使用Semaphore工具类

这篇文章将为大家详细讲解有关如何在Java中使用Semaphore工具类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Semaphore的理解Semaphore属于java.util.c
2023-06-15

如何在java中使用 Arrays工具类

如何在java中使用 Arrays工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Arrays工具类属于java中常用的工具类public static void so
2023-05-31

如何在Java中使用EasyExcel工具类

今天就跟大家聊聊有关如何在Java中使用EasyExcel工具类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web M
2023-06-14

如何使用Java进行大数据处理?(Java在大数据处理中有哪些应用方法和工具?)

Java在大数据处理中发挥着重要作用,提供广泛的工具和框架。ApacheSpark、Hadoop、Hive和Pig支持快速数据处理、分布式存储和交互式查询。Oozie和Azkaban帮助调度数据处理作业。Lucene和Elasticsearch提供文本数据搜索。Kafka和Storm用于实时数据流处理。Mahout、SparkMLlib和Weka等其他库提供机器学习功能。利用这些工具,Java开发人员可以高效处理大数据。
如何使用Java进行大数据处理?(Java在大数据处理中有哪些应用方法和工具?)
2024-04-02

java dump文件分析工具如何使用

要使用Java dump文件分析工具,首先需要下载并安装适合您操作系统的工具。一些常用的工具包括MAT(Memory Analyzer Tool)和VisualVM。以下是使用MAT进行Java dump文件分析的一般步骤:1. 下载并安装
2023-10-10

如何使用PHP数据库迁移工具Phinx

这篇文章给大家分享的是有关如何使用PHP数据库迁移工具Phinx的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.安装composer require nhzex/think-phinx2.执行php vendo
2023-06-29

如何安装和使用Elasticsearch工具cerebro的

本篇内容主要讲解“如何安装和使用Elasticsearch工具cerebro的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何安装和使用Elasticsearch工具cerebro的”吧!Ce
2023-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录