jdk安装教程_JDK 14 / JEP 305模式匹配“ Smart Casts”实例

2023-11-01 15:50

本文主要是介绍jdk安装教程_JDK 14 / JEP 305模式匹配“ Smart Casts”实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jdk安装教程

jdk安装教程

我通常将Java代码中instanceof运算符的存在视为“红色标志”,这意味着在某些情况下使用instanceof不一定是错误的,但是使用它有时表示可以以更简洁的方式解决设计问题,如所述本文结尾处引用的一些资源中的内容(包括有关Java以外语言的类似类型检查功能的资源)。

尽管我已经看到instanceof不需要使用多次,但我遇到了更多情况,要避免instanceof并不容易。 当使用遗留代码库以及某些库和框架时,尤其如此,在这些库和框架中,我无法重构类之间的关系以支持接口,方法重写以及其他可用于消除对instanceof

与使用的一个非常普通的技术instanceof是立即强制转换为类型在有条件使用检查instanceof 。 JEP 305 [“针对instanceof(预览)的模式匹配”]提供了这种常见模式的示例,在这里我略微修改了该示例:

 if (object instanceof String){final String string = (String) object;// Do something with the 'string' variable typed as String}

本杰·韦伯(Benji Weber )发布了有关使用反射和使用lambda表达式来实现类似于Kotlin的“智能转换实例”的文章。 幸运的是, JDK 14和JEP 305为这种方法带来了内置的语言支持(尽管处于预览状态)。

JDK 14引入了预览功能,该功能允许在条件内完全实现条件和instanceof 。 接下来显示对以上代码示例的影响:

 if (object instanceof String string){// Do something with the 'string' variable typed as String}

此预览功能在JDK 14 Early Access Builds中可用,而我在本文中的示例中使用的是JDK 14 Early Access Build 34

在JDK 14 JEP 305预览功能是一个小的精密,其优点是在漫长的更加明显if - then - else的条件语句。 接下来的两个代码清单比较了调用instanceof的“旧方法”和显式转换为使用instanceof模式匹配的“新预览方法”。

传统instanceof结合显式cast

 static void makeAnimalNoises( final Object animal){if (animal Dog) (animal instanceof Dog){final Dog dog = (Dog) animal;out.println(dog.bark());}else if (animal Cat) (animal instanceof Cat){final Cat cat = (Cat) animal;out.println(cat.meow());}else if (animal Duck) (animal instanceof Duck){final Duck duck = (Duck) animal;out.println(duck.quack());}else if (animal Horse) (animal instanceof Horse){final Horse horse = (Horse) animal;out.println(horse.neigh());}else if (animal Cow) (animal instanceof Cow){final Cow cow = (Cow) animal;out.println(cow.moo());}else if (animal instanceof Lion){final Lion lion = (Lion) animal;out.println(lion.roar());}else{out.println( "ERROR: Unexpected animal: " + animal);}}

JDK 14 / JEP 305预览功能

 static void makeAnimalNoises( final Object animal){if (animal Dog dog) (animal instanceof Dog dog){out.println(dog.bark());}else if (animal Cat cat) (animal instanceof Cat cat){out.println(cat.meow());}else if (animal Duck duck) (animal instanceof Duck duck){out.println(duck.quack());}else if (animal instanceof Horse horse){out.println(horse.neigh());}else if (animal Cow cow) (animal instanceof Cow cow){out.println(cow.moo());}else if (animal Lion lion) (animal instanceof Lion lion){out.println(lion.roar());}else{out.println( "ERROR: Unexpected animal: " + animal);}}

完整的代码在GitHub上,并且可以使用旧方法和新预览方法之间的区别。

由于instanceof模式匹配是预览功能,因此使用此功能的代码必须使用javac标志--enable-preview-source 14进行编译。 它必须使用java标志--enable-preview

结论

有关如何实现此功能的更多详细信息,请参见“ RFR:JDK-8237528:instanceof的模式匹配的低效率编译”一文。 instanceof模式匹配支持是Amber向Java减少样板代码提供的又一步。

有关使用instanceof问题的资源

  • Java'instanceOf':为什么以及如何在代码中避免使用它
  • 您真的需要instanceof吗?
  • 在Java中使用instanceof是否考虑了不良做法?
  • 使用Instanceof主要是代码异味
  • 有条件的Instanceof:代码气味
  • 当心instanceof运算符
  • “ instanceof”有多邪恶?
  • 类型检查是代码异味

翻译自: https://www.javacodegeeks.com/2020/02/jdk-14-jep-305-instanceof-pattern-matching-smart-casts.html

jdk安装教程

这篇关于jdk安装教程_JDK 14 / JEP 305模式匹配“ Smart Casts”实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/324085

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP