每日一课 | 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运算符和访客模式替换相关推荐

  1. oracle无效的关系运算符_每日一课 | Java 8中的instanceof运算符和访客模式替换

    我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长.所以我想出了以下DSL语法: Object msg = //... whenTypeOf(msg).     ...

  2. Java 8中的instanceof运算符和访客模式替换

    我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTypeOf(msg).is(D ...

  3. instanceof运算符_Java 8中的instanceof运算符和访客模式替换

    instanceof运算符 我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTy ...

  4. 【极客学院每日1课 】Java入门与常用技巧

    2019独角兽企业重金招聘Python工程师标准>>> Java是Android开发者必学的基础编程语言.你的基础怎么样? 遥想当年,小乔还未出嫁,小编在大学里面,啃书本,听教授在课 ...

  5. 快乐编程大本营【java语言训练班】第5课: java的数组编程

    快乐编程大本营[java语言训练班]第5课: java的数组编程 第1节. 声明数组变量 第2节. 创建数组对象 第3节. 访问数组元素 第4节. 修改数组元素 第5节. 多维数组 学习地址如下: h ...

  6. 每日一课 | 在Python中获取列表的长度和大小

    Python是一种非常具有表现力的语言,它提供了不同的结构来简化开发人员的工作.该列表是python提供的最受欢迎的数据结构之一.在常规工作流程中,我们在列表中添加元素或从列表中删除元素.但是在这种浮 ...

  7. java instanceof运算符_Java 中的instanceof 运算符

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...

  8. java程序设计_十分钟说课—Java程序设计(耿祥义)

    "十分钟说课"-Java程序设计 耿祥义视频说课: 课程概述 1. Java入门 1) 重点内容,三个基本步骤: 编写源文件,编译,运行. 2)JDK,使用JDK11以上版本,注意 ...

  9. java开发工程师培训费,南通渡课Java开发工程师培训费用是多少

    本页是南通渡课教育为您整理关于南通Java培训费用的详情页面,南通Java培训费用,就选南通渡课教育,教育培训知名品牌,名师执教.通俗易懂.深受广大学员所欢迎. Java是一种可以撰写跨平台应用软件的 ...

最新文章

  1. 关系数据库的数据迁移
  2. 根据关键字检索相关视频
  3. 鼠标动效html,5种纯CSS3鼠标hover按钮动画效果
  4. sqlserver循环like变量_numba从入门到精通(6)—numba与循环与并行
  5. MySQL什么是关系_MySQL教程-关系模型
  6. sqlsession.selectlist 会返回null么_如何在Java代码中去掉烦人的“!=null”
  7. java中文乱码decode_JAVA中文字符乱码解决详解
  8. 微信公众号介绍_以及注册订阅号---微信公众号开发工作笔记0001
  9. 在VS.Net2010开发平台学习云计算开发
  10. Python界面程序实例:按钮漂移,用Python小套路来撩女神
  11. 让 list-style-image 图片垂直居中
  12. noip2011——普及组——瑞士轮
  13. 升讯威周报与工时统计系统 V3
  14. 基于java的化妆品购物商城微信小程序的设计与实现 毕业设计毕设参考
  15. 三级等保成标配,互联网医院安全架构报告发布
  16. Spring之DI依赖注入
  17. 2016阿里巴巴校招内推offer (by 伟伯)
  18. Exp3 免杀原理与实践 20164302 王一帆
  19. css3波浪动画特效
  20. Debug以及解题思路

热门文章

  1. input 输入数字而且最大为10
  2. 【JDK】win 10 / win 11:jdk 8 升级为 jdk 17
  3. python培训上岗
  4. 简述工业机器人码垛工作站系统构成_模块一工业机器人码垛工作站系统集成.PDF...
  5. 使用记事本编写Java程序的运行步骤及乱码问题
  6. 联想Y400怎么样在插入鼠标时自动禁用触摸板
  7. 春招面试(1)- 中科院软件中心/中科院自动化研究所
  8. 观点丨区块链未来这一年
  9. Spring框架技术总结(一),如何才能更容易拿到大厂Offer
  10. python抓取网站访客手机号_三网运营商大数据实时截流网站访客