java 访客模式,每日一课 | Java 8中的instanceof运算符和访客模式替换
每日一课 | Java 8中的instanceof运算符和访客模式替换
每日一课 | Java 8中的instanceof运算符和访客模式替换
我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长。所以我想出了以下DSL语法:
Object msg = //...
whenTypeOf(msg).
is(Date.class). then(date -> println(date.getTime())).
is(String.class). then(str -> println(str.length())).
is(Number.class). then(num -> println(num.intValue())).
orElse(obj -> println("Unknown " + obj));
在Java 8中,没有向下转换,简洁的语法,强类型的……完全可以实现的。使用lambda和一些泛型,我创建了一个名为typeof的小型库 ,它比instanceof和Visitor模式结合在一起是干净的,易于使用且更健壮的。优势包括:
没有明确的垂头丧气
避免instanceof
清洁且易于使用
强类型
适用于我们无法控制的类,包括JDK
这个小实用程序是出于Akka和Java API的目的而开发的,目的是限制instanceof运算符的使用,但它更通用。同样,您可以根据运行时类型返回一些信息:
int result = whenTypeOf(obj).
is(String.class).thenReturn(String::length).
is(Date.class).thenReturn(d -> (int) d.getTime()).
is(Number.class).thenReturn(Number::intValue).
is(TimeZone.class).thenReturn(tz -> tz.getRawOffset() / 1000).
is(MyType.class).thenReturn(7).
get();
该库从上到下检查每个is()子句,如果找到包括父类在内的第一个匹配类,则停止运行,因此is(Number.class)将同时匹配Integer和Float 。如果没有条件匹配,则调用get将失败,并带有异常。您可以使用orElse()重写此行为orElse()比等效的is(Object.class)更容易阅读):
int result = whenTypeOf(obj).
is(String.class).thenReturn(String::length).
//...
orElse(42);
DSL利用Java中的静态类型的优势,几乎不可能错误地使用该库-大多数错误会在编译期间立即捕获。以下所有代码段甚至都不会编译:
//ERROR - two subsequent is()
whenTypeOf(obj).
is(Foo.class).is(Bar.class)
//ERROR - then() without prior is()
whenTypeOf(obj).
then(x -> println(x))
//ERROR - mixing then() and thenReturn()
whenTypeOf(obj).
is(Foo.class).then(foo -> println(foo)).
is(Bar.class).thenReturn(bar -> bar.getB());
基本上,您首先输入whenTypeOf()和Ctrl + space会准确告诉您允许的内容。使用静态类型语言设计类型安全且健壮的DSL的关键是尽可能地限制API,以便在编译时避免无效的状态和调用。您最终将获得大量的小类 ,但这没关系,您的用户将不会看到此内容。例如,签出FirstIs.java –第一次调用is()之后返回的对象:
public class FirstIs {
final Then parent;
private final S object;
private final Class expectedType;
public Then then(Consumer thenBlock) {
if (matchingType()) {
thenBlock.accept(castObject());
return new TerminalThen<>();
}
return parent;
}
public ThenReturn thenReturn(Function result) {
if (matchingType()) {
return new TerminalThenReturn<>(object, result.apply(castObject()));
}
return new ThenReturn<>(object);
}
public ThenReturn thenReturn(R result) {
if (matchingType()) {
return new TerminalThenReturn<>(object, result);
}
return new ThenReturn<>(object);
}
//...
}
编写DSL比使用DSL困难得多,但最终还是很有收获的。注意如何使用不同的返回类型( Then vs. ThenReturn )只是为了确保在每个阶段只能访问有效的方法。另一种方法是实现运行时检查(例如,您不编写is(...).is(...).then(...) )–但是为什么还要麻烦编译器为我们做呢?
希望您喜欢本文,如果您愿意在项目中尝试使用此实用程序,请告诉我。它可以在GitHub上获得 。
参考:来自Java和社区博客的JCG合作伙伴 Tomasz Nurkiewicz提供的Java 8中的instanceof运算符和访客模式替换 。
翻译自:https://www.javacodegeeks.com/2013/10/instanceof-operator-and-visitor-pattern-replacement-in-java-8.html
今日福利
点击阅读原文,一起玩耍
每日一课 | Java 8中的instanceof运算符和访客模式替换相关教程
JAVA方式对接FIL节点钱包
JAVA方式对接FIL节点钱包 官网Lotus JSON-RPC API 链接: https://docs.filecoin.io/reference/lotus-api/#endpoints 完整RPC源码文档 链接: https://pkg.go.dev/github.com/filecoin-project/lotus/api?tab=doc#FullNode 实现下面之前需要先搭建FIL钱包节点
详解构建可运行的JavaScript规范的方法
编程不仅仅是给计算机下达如何完成一项任务的指令,它还包括以一种精确的方式与他人交流思想,甚至是与未来的自己。这样的交流可以有多个目标,也许是为了共享信息,或者只是为了更容易地修改—如果你不理解或不记得很久以前做过什么,那么就很难修改。 当我
Java类的加载及单亲委派模型
Java类的加载及单亲委派模型 类的生命周期: 加载-链接(验证+准备+解析)-初始化(使用前的准备)-使用-卸载。 其中,类的加载过程是 加载-链接(验证+准备+解析)-初始化(使用前的准备) 验证是验证代码合法性 准备是创建静态变量以及设置静态变量的初始值
[适合初中级Java程序员修炼手册从0搭建整个Web项目]
[适合初中级Java程序员修炼手册从0搭建整个Web项目] 前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206 种一棵树最好的时间是十年前,其次是现在 six-finger-web 一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务
Github上42.4K的JAVA跑动起来、调试、教你看代码
Github上42.4K的JAVA跑动起来、调试、教你看代码 mall项目是一套电商系统,包括前台商城系统及后台管理系统,看完代码对自己能力将有非常大的提高,为了更好的让大家心里明白后端究竟该做什么,前端项目就直接废弃,我们全部改用在线调用接口的方式进行调试处
【Java 面试题系列 05】Class类的作用是什么?如何获取Class对象
【Java 面试题系列 05】Class类的作用是什么?如何获取Class对象? 点击上方“ 方才编程 ”,每天进步一点点! 决定每天上午8点整,分享一道 Java 面试题。厚积薄发,每天进步一点点! 【第 5 天】题目 Class类的作用是什么?如何获取Class对象? 参考答案 Cl
LeetCode每日一题!!(LCP 01.猜数字)
LeetCode每日一题!!(LCP 01.猜数字) 题目 :小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的guess数组为 小A 每次的猜测,answer数组为 小B
JavaTCP连接
JavaTCP连接 输入输出操作 可以这样理解: 服务器操作 import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class Server { private static int port = 8002;//设置端口号 public static void main(String[] args)throws IOExcepti
java 访客模式,每日一课 | Java 8中的instanceof运算符和访客模式替换相关推荐
- oracle无效的关系运算符_每日一课 | Java 8中的instanceof运算符和访客模式替换
我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长.所以我想出了以下DSL语法: Object msg = //... whenTypeOf(msg). ...
- Java 8中的instanceof运算符和访客模式替换
我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTypeOf(msg).is(D ...
- instanceof运算符_Java 8中的instanceof运算符和访客模式替换
instanceof运算符 我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTy ...
- 【极客学院每日1课 】Java入门与常用技巧
2019独角兽企业重金招聘Python工程师标准>>> Java是Android开发者必学的基础编程语言.你的基础怎么样? 遥想当年,小乔还未出嫁,小编在大学里面,啃书本,听教授在课 ...
- 快乐编程大本营【java语言训练班】第5课: java的数组编程
快乐编程大本营[java语言训练班]第5课: java的数组编程 第1节. 声明数组变量 第2节. 创建数组对象 第3节. 访问数组元素 第4节. 修改数组元素 第5节. 多维数组 学习地址如下: h ...
- 每日一课 | 在Python中获取列表的长度和大小
Python是一种非常具有表现力的语言,它提供了不同的结构来简化开发人员的工作.该列表是python提供的最受欢迎的数据结构之一.在常规工作流程中,我们在列表中添加元素或从列表中删除元素.但是在这种浮 ...
- java instanceof运算符_Java 中的instanceof 运算符
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...
- java程序设计_十分钟说课—Java程序设计(耿祥义)
"十分钟说课"-Java程序设计 耿祥义视频说课: 课程概述 1. Java入门 1) 重点内容,三个基本步骤: 编写源文件,编译,运行. 2)JDK,使用JDK11以上版本,注意 ...
- java开发工程师培训费,南通渡课Java开发工程师培训费用是多少
本页是南通渡课教育为您整理关于南通Java培训费用的详情页面,南通Java培训费用,就选南通渡课教育,教育培训知名品牌,名师执教.通俗易懂.深受广大学员所欢迎. Java是一种可以撰写跨平台应用软件的 ...
最新文章
- 关系数据库的数据迁移
- 根据关键字检索相关视频
- 鼠标动效html,5种纯CSS3鼠标hover按钮动画效果
- sqlserver循环like变量_numba从入门到精通(6)—numba与循环与并行
- MySQL什么是关系_MySQL教程-关系模型
- sqlsession.selectlist 会返回null么_如何在Java代码中去掉烦人的“!=null”
- java中文乱码decode_JAVA中文字符乱码解决详解
- 微信公众号介绍_以及注册订阅号---微信公众号开发工作笔记0001
- 在VS.Net2010开发平台学习云计算开发
- Python界面程序实例:按钮漂移,用Python小套路来撩女神
- 让 list-style-image 图片垂直居中
- noip2011——普及组——瑞士轮
- 升讯威周报与工时统计系统 V3
- 基于java的化妆品购物商城微信小程序的设计与实现 毕业设计毕设参考
- 三级等保成标配,互联网医院安全架构报告发布
- Spring之DI依赖注入
- 2016阿里巴巴校招内推offer (by 伟伯)
- Exp3 免杀原理与实践 20164302 王一帆
- css3波浪动画特效
- Debug以及解题思路
热门文章
- input 输入数字而且最大为10
- 【JDK】win 10 / win 11:jdk 8 升级为 jdk 17
- python培训上岗
- 简述工业机器人码垛工作站系统构成_模块一工业机器人码垛工作站系统集成.PDF...
- 使用记事本编写Java程序的运行步骤及乱码问题
- 联想Y400怎么样在插入鼠标时自动禁用触摸板
- 春招面试(1)- 中科院软件中心/中科院自动化研究所
- 观点丨区块链未来这一年
- Spring框架技术总结(一),如何才能更容易拿到大厂Offer
- python抓取网站访客手机号_三网运营商大数据实时截流网站访客