JDK 14全景透视:每个Java开发者必知的新特性

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

JDK 14全景透视:每个Java开发者必知的新特性

    • 前言:
    • switch表达式标准化
      • Switch表达式成为正式特性的意义:
      • 如何使用Switch表达式:
      • 注意事项:
    • instanceof模式匹配
      • Pattern Matching for `instanceof` 的好处:
      • 使用Pattern Matching for `instanceof` 的示例:
      • 注意事项:
    • records
      • Records的基本概念:
      • Records的语法:
      • 使用Records的场景:
      • 注意事项:
    • NullPointerExceptions
      • NullPointerExceptions的传统问题:
      • JEP 358的主要特点:
      • 示例:
      • 如何启用Helpful NullPointerExceptions:
      • 注意事项:

前言:

随着技术界不断进步,Java也在持续演变,每个新版本都带来了创新和提升。JDK 14不仅仅是一次更新,它是Java演变史上的一个重要里程碑,为开发者提供了前所未有的工具和能力。本文将带你深入了解JDK 14的每一个角落,探索它是如何推动Java走向新高度的。

switch表达式标准化

在JDK 14中,Switch表达式(switch)从预览状态被提升为正式特性,这标志着Java语言在简化控制流结构方面迈出了重要一步。这个特性的目的是让开发者能够以更简洁、更安全的方式编写条件逻辑。

Switch表达式成为正式特性的意义:

  1. 代码简洁性

    • 传统的switch语句需要显式的break语句来防止代码"掉落"到下一个分支。Switch表达式通过引入箭头(->)来消除这种需要,每个案例自动终止,减少了样板代码。
  2. 可读性和安全性

    • Switch表达式减少了代码的复杂性,使得代码更易读、更易理解。同时,它也减少了因遗漏break语句而导致的错误。
  3. 表达能力

    • Switch表达式可以返回值,并允许多个标签指向同一代码块,这为表达复杂逻辑提供了更大的灵活性和力量。

如何使用Switch表达式:

以下是一个示例,展示了如何使用Switch表达式来简化代码:

传统的switch语句

String monthString;
switch (month) {case 1:  monthString = "January";break;case 2:  monthString = "February";break;// ... more cases ...default: monthString = "Unknown";break;
}

使用Switch表达式

String monthString = switch (month) {case 1  -> "January";case 2  -> "February";// ... more cases ...default -> "Unknown";
};

在这个示例中,Switch表达式不仅使代码更简洁,而且通过直接返回值,使得整个结构更直观。

注意事项:

  • 兼容性:作为正式特性,Switch表达式在JDK 14及更高版本中完全支持,不再需要特殊的编译器标志来启用。
  • 默认行为:如果没有匹配的case且没有定义default,Switch表达式会抛出异常,确保所有可能的情况都被处理。
  • 代码风格:虽然Switch表达式提供了更大的灵活性,但在使用时仍需考虑代码风格和一致性,确保代码的可维护性。

通过将Switch表达式纳入正式特性,JDK 14为Java开发者提供了一个更强大、更简洁的工具来处理多分支条件逻辑,有助于提高代码质量和开发效率。

instanceof模式匹配

在JDK 14中引入的Pattern Matching for instanceof 是一个预览特性,它旨在简化Java中的类型检查和转换操作。这个特性通过允许你在同一个表达式中同时进行类型检查和变量赋值,使得相关代码更简洁、更易读。

Pattern Matching for instanceof 的好处:

  1. 减少冗余

    • 传统的类型检查和转换需要多个步骤:首先使用instanceof检查类型,然后将对象转换为相应类型。Pattern Matching for instanceof 将这两个步骤合二为一,减少了重复代码。
  2. 提高可读性

    • 通过减少不必要的模板代码,使得开发者可以更直接地表达他们的意图,代码因此更加清晰。
  3. 避免错误

    • 在传统的instanceof检查和类型转换模式中,很容易在类型转换时使用错误的变量,而Pattern Matching for instanceof 通过绑定变量减少了这种错误的可能性。

使用Pattern Matching for instanceof 的示例:

传统方式

if (obj instanceof String) {String s = (String) obj;// 使用s进行操作
}

在这个传统模式中,需要明确地进行类型转换,并且需要额外的变量声明。

使用Pattern Matching for instanceof

if (obj instanceof String s) {// 直接使用s进行操作
}

在这个新模式中,instanceof 不仅检查了obj 是否为String 类型,同时也在同一个表达式中声明了新的变量s,并将obj转换为String并赋值给s。如果obj不是String类型,这段代码不会执行,并且s不会被定义。

注意事项:

  • 预览特性:作为预览特性,需要在编译和运行时启用特定的标志才能使用。
  • 作用域:引入的变量(如示例中的s)的作用域被限定在if语句块内,这有助于避免命名冲突和意外的变量使用。
  • 最佳实践:尽管Pattern Matching for instanceof 可以使代码更简洁,但在使用它时仍应考虑代码的清晰性和易维护性。

通过引入Pattern Matching for instanceof,JDK 14为Java开发者提供了一个更加强大和表达性的工具来处理类型检查和转换,有助于简化代码并减少常见的编码错误。

records

在JDK 14中,Records是一个预览特性,引入了一种新的类型声明,旨在提供一种简洁的方式来模拟“纯数据”的概念。Records旨在作为Java中不可变数据的简洁和安全的表示,特别适用于那些作为数据载体的类。

Records的基本概念:

  1. 数据载体

    • Records被设计为不可变的数据载体,适合用于传递数据和创建数据对象。它们提供了一种简洁的方式来定义包含数据但没有额外行为的类。
  2. 简洁性

    • 传统的Java类可能需要大量的样板代码,包括字段、构造函数、getter、equals()、hashCode()和toString()。Records通过单一的声明自动提供这些功能。
  3. 不可变性

    • Record中的字段是final的,这意味着它们在初始化后不能被修改,这有助于保证对象状态的不变性和线程安全性。

Records的语法:

record Point(int x, int y) { }

在这个例子中,Point是一个record,它有两个字段:xy。Java自动为这些字段生成了构造函数、getter方法、以及适当的equals()、hashCode()和toString()实现。

使用Records的场景:

  1. DTOs (Data Transfer Objects)

    • 当你需要传递数据时,Records提供了一种更简洁、更安全的方式来定义DTOs。
  2. 缓存键

    • Records的自动hashCode和equals实现使得它们非常适合用作缓存或Map中的键。
  3. 模式匹配

    • 尽管Java还没有正式支持模式匹配,但Records的结构和不可变性使它们成为未来支持模式匹配时的理想选择。

注意事项:

  • 预览特性:作为预览特性,你需要在编译和运行时启用特定的标志才能使用Records。
  • 限制:由于Records旨在作为不可变数据载体,它们不能被继承,每个record字段也是final的。
  • 最佳实践:在使用Records之前,考虑你的使用场景。如果你需要一个纯数据类,不需要额外的方法或继承,Records可能是一个优秀的选择。

通过引入Records,JDK 14提供了一种新的方式来表示不可变数据,旨在减少样板代码,增强代码可读性,同时提供不可变性的安全保证。

NullPointerExceptions

JEP 358: Helpful NullPointerExceptions 是在JDK 14中引入的一个重要改进,旨在增强空指针异常(NullPointerException, NPE)的可诊断性。这个改进为开发者提供了更多的上下文信息,帮助他们快速理解和修复产生NPE的原因。

NullPointerExceptions的传统问题:

  1. 缺乏信息

    • 传统的NPE通常不提供足够的信息来确定导致异常的确切原因和位置,特别是在复杂的表达式中。
  2. 调试困难

    • 开发者通常需要花费大量时间在调试器中逐步执行或添加额外的日志语句来确定哪个具体的变量或方法调用返回了null

JEP 358的主要特点:

  1. 详细的异常信息

    • 当NPE发生时,异常消息现在会提供关于哪个变量或哪个表达式部分是null的详细信息。这使得诊断问题变得更直接。
  2. 精确的定位

    • 异常信息能够指出是哪个变量或方法调用产生了null,即使它是一个复杂表达式的一部分。
  3. 可选启用

    • 由于改进的NPE消息可能会泄露敏感信息,它默认是禁用的。你可以选择性地为特定运行或整个系统启用它。

示例:

假设有以下代码:

public class NPEExample {public static void main(String[] args) {Person person = new Person();String name = person.getName().toUpperCase();}
}class Person {String name;String getName() { return name; }
}

在这个例子中,person.getName() 返回null,导致尝试调用toUpperCase()时抛出NPE。

传统的NPE消息

Exception in thread "main" java.lang.NullPointerExceptionat NPEExample.main(NPEExample.java:4)

这个消息没有说明是哪个具体的部分为null

使用Helpful NullPointerExceptions的消息

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toUpperCase()" because "person.getName()" is nullat NPEExample.main(NPEExample.java:4)

这个改进的消息清晰地指出person.getName()null,这是尝试调用toUpperCase()时出错的原因。

如何启用Helpful NullPointerExceptions:

  • 在JVM启动时,使用-XX:+ShowCodeDetailsInExceptionMessages选项来启用这个特性。

注意事项:

  • 性能考虑:虽然这个特性在大多数情况下对性能影响不大,但在异常密集的代码中可能会有轻微的性能开销。
  • 安全性:改进的异常信息可能会包含敏感数据。确保在处理敏感信息时考虑这一点,特别是在生产环境中。

通过JEP 358: Helpful NullPointerExceptions,JDK 14为开发者提供了一个强大的工具来快速定位和解决空指针异常,减少了调试的难度和时间,提高了开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九部分 图论

目录 例 相关概念 握手定理 例1 图的度数列 例 无向图的连通性 无向图的连通度 例2 例3 有向图D如图所示,求 A, A2, A3, A4,并回答诸问题: 中间有几章这里没有写,感兴趣可以自己去学,组合数学跟高中差不多&#xff0c…

亚马逊云科技 re:Invent 大会 - ElastiCache Serverless 模式来袭

大会介绍 亚马逊云科技的 re:Invent 大会是一年一度的,面向全球技术开发者科技盛会。几乎每次都会发布云科技、云计算等相关领域的产品重磅更新,不但将时下主流热门的技术不断整合,也未将来的发展标明了方向。 亚马逊云科技开发者社区为开发…

【滑动窗口】【map】LeetCode:76最小覆盖子串

作者推荐 【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值 本文涉及知识点 滑动窗口 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对…

根据DCT特征训练CNN

记录一次改代码的挣扎经历: 看了几篇关于DCT频域的深度模型文献,尤其是21年FcaNet:基于DCT 的attention model,咱就是说想试试将我模型的输入改为分组的DCT系数,然后就开始下面的波折了。 第一次尝试&#xf…

深入解析 Flink CDC 增量快照读取机制

一、Flink-CDC 1.x 痛点 Flink CDC 1.x 使用 Debezium 引擎集成来实现数据采集,支持全量加增量模式,确保数据的一致性。然而,这种集成存在一些痛点需要注意: 一致性通过加锁保证:在保证数据一致性时,Debez…

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850 2023/12/26 8:22 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab And…

如何配置TLSv1.2版本的ssl

1、tomcat配置TLSv1.2版本的ssl 如下图所示&#xff0c;打开tomcat\conf\server.xml文件&#xff0c;进行如下配置&#xff1a; 注意&#xff1a;需要将申请的tomcat版本的ssl认证文件&#xff0c;如server.jks存放到tomcat\conf\ssl_file\目录下。 <Connector port"1…

Linux介绍、安装、常见命令

Linux介绍 Linux是一种开源的操作系统&#xff0c;其内核由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在1991年开始开发。与其他常见的操作系统如Windows和Mac OS不同&#xff0c;Linux是一个开放、自由的系统&#xff0c;可以免费使用、修改和分发。 Linux的核心特…

企业级实战项目:基于 pycaret 自动化预测公司是否破产

本文系数据挖掘实战系列文章&#xff0c;我跟大家分享一个数据挖掘实战&#xff0c;与以往的数据实战不同的是&#xff0c;用自动机器学习方法完成模型构建与调优部分工作&#xff0c;深入理解由此带来的便利与效果。 1. Introduction 本文是一篇数据挖掘实战案例&#xff0c;…

uniapp APP应用程序iOS没有上架到苹果应用商店如何整包更新?

随着移动互联网的快速发展&#xff0c;uni-app 作为一种跨平台开发框架&#xff0c;受到了广泛欢迎。然而&#xff0c;有时候开发者可能会遇到一个问题&#xff1a;如何为已经发布到苹果应用商店的 uni-app APP 进行整包更新&#xff1f;尤其是当应用还没有上架到苹果应用商店时…

nodejs进阶

文章目录 写在前面一、dependencies、devDependencies和peerDependencies区别&#xff1a;二、需要牢记的npm命令2.1 npm init2.2 npm config list2.3 npm配置镜像源 三、npm install 的原理四、package-lock.json的作用五、npm run 的原理六、npx6.1 npx是什么6.2 npx的优势6.…

深信服技术认证“SCSA-S”划重点:文件上传与解析漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

从AMI镜像恢复AWS Amazon Linux 2实例碰到的VNC服务以及Chrome浏览器无法启动的问题

文章目录 小结问题及解决VNC服务无法启动Chrome浏览器无法启动 参考 小结 将Amazon Linux 2保存为AMI (Amazon Machine Images)后&#xff0c;恢复成EC2 Instance (实例)后&#xff0c;VNC服务以及Chrome浏览器无法启动&#xff0c;进行了解决。 问题及解决 如果要将一个EC2…

treeview数据的保存和读取(以表格方式保存)

一个简单的treeivew&#xff0c;以表格方式保存比较简单&#xff0c;遍历所有节点&#xff0c;记录parentNode、node、data即可 parentiddataid002xx2001005xx5000003xx3001006xx6002007xx7001000xx0001001xx1-1004xx4007 如何将表格转为tree数据&#xff0c;代码如下&#xf…

数据结构-十大排序算法

数据结构十大排序算法 十大排序算法分别是直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、外部排序。 其中插入排序包括直接插入排序、折半插入排序、希尔排序&#xff1b;交换排序包括冒泡排序、快速排序&#xff1…

LSTM中文新闻分类源码详解

LSTM中文新闻分类 一、导包二、读取数据三、数据预处理1.分词、去掉停用词和数字、字母转换成小写等2.新闻文本标签数值化 三、创建词汇表/词典1.data.Field()2.空格切分等3.构建词汇表/词典使用训练集构建单词表&#xff0c;vectorsNone:没有使用预训练好的词向量,而是使用的是…

阿里云自建官方Docker仓库镜像提交拉取方法

文章目录 发布镜像到DockerHub发布镜像到自建Docker仓库(Harbor)修改配置文件在Linux服务器中登录Docker打TAGPUSH提交镜像PULL拉取镜像 发布镜像到阿里云容器服务在Linux服务器中登录DockerPUSH提交镜像PULL拉取镜像 发布镜像到DockerHub 本地我们镜像命名可能会不规范&#…

详解Keras3.0 Layer API: LSTM layer

LSTM layer 用于实现长短时记忆网络&#xff0c;它的主要作用是对序列数据进行建模和预测。 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;根据当前输入和上一个时间步的隐藏状态&#xff0c;计算遗忘门的值。遗忘门的作用是控制哪些信息应该被遗忘&#xff0c;哪些…

C++面试宝典第10题:绘制各种图形

题目 我们需要编写一个图形相关的应用程序,并处理大量图形(Shape)信息,图形有矩形(Rectangle)、正方形(Square)、圆形(Circle)等种类。应用程序需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式作为示意)。 (1)请使用面…

华为——使用ACL限制内网主机访问外网网站示例

组网图形 图1 使用ACL限制内网主机访问外网网站示例 ACL简介配置注意事项组网需求配置思路操作步骤配置文件 ACL简介 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#…