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

news2024/11/18 15:43:51

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


在这里插入图片描述

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.NullPointerException
    at NPEExample.main(NPEExample.java:4)

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

使用Helpful NullPointerExceptions的消息

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

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

如何启用Helpful NullPointerExceptions:

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

注意事项:

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

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

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

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

相关文章

【PostGIS】在Java中操作postgis——使用springboot+Maven+mybatis框架

前言: PostgreSQL15对应PostGIS安装教程及空间数据可视化 空间数据库-常用空间函数 完成PostGIS的安装与配置后,让我们来写一个Java操作postgis数据库的demo吧~ 使用工具: NavicatIDEA 一、PostGIS数据库准备 在Navicat中新建一个postgr…

前端Vue进阶

Vue进阶 当你熟悉了Vue.js的基本概念和用法后,可以继续深入学习Vue.js的进阶内容。以下是一些Vue.js的进阶主题,可以帮助你更好地理解和应用Vue.js。 组件通信 Vue.js提供了多种方式来实现组件之间的通信。除了父子组件之间的通信,还有兄弟…

python降低图像的空间分辨率——冈萨雷斯数字图像处理

原理: 降低图像的空间分辨率意味着减少图像中可见的细节,使图像变得模糊或粗糙。这可以通过减少图像的像素数量或改变像素的排列来实现。以下是一些降低图像空间分辨率的常见原理和方法: 下采样(Subsampling)&#xf…

多功能演示工具ProVideoPlayer2 mac特色介绍

ProVideoPlayer2 mac是用于大多数任何生产的首选多功能演示工具。ProVideoPlayer 2是一种动态视频播放和处理媒体服务器,可将视频映射(包括播放和实时视频输入)实时控制到一个或多个输出。包括实时效果,调度,网络同步和…

Spring中常见的Bean后处理器

Bean后处理器的作用:为Bean生命周期各个阶段提供扩展。接下来我们查看一个案例 public class TestBeanPostProcessor {public static void main(String[] args) {//该容器不存在任何Spring中的bean对象,是一个干净的容器,且提供了正常容器中…

<JavaEE> 协议格式 -- 传输层协议 TCP

目录 一、TCP协议格式长啥样? 二、TCP协议属性解释 1)源端口号/目的端口号 2)序号/确认序号 3)TCP报头长度 4)保留位 5)标志位 6)窗口大小 7)校验和 8)紧急指针…

Oracle查询重复数据取第二行,好用来删除重复数据

Oracle查询重复数据取第二行,好用来删除重复数据 SELECT * FROM ( SELECT e.* , ROW_NUMBER() over(PARTITION BY product_category_id,model_size_id ORDER BY product_category_id,model_size_id) rn FROM equ_check_rules e ) s WHERE rn 2;

OSPF单区域配置-新版(11)

目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.3 配置R3的IP 1.4 配置PC-1的IP地址 1.5 配置PC-2的IP地址 1.6 配置PC-3的IP地址 1.7 检测R1直连链路连通性 1.8 检测R3直连链路连通性 1.9 检测R2直连链路连通性 2. 部署单区域OSPF网络 2.1…

php 不加后缀访问

实现不带后缀访问php文件的方法:首先在htaccess文件中加入内容“RewriteRule ^(api/token) token.php [L]”;然后通过根目录下的“token.php”来接受“api/token”;最后修改配置文件。 考虑的做法有: HTTP重写技术,让…

初探大模型微调

目标:低成本微调大模型,拥有属于自己的AI助手。 一切的一切,都得益于LoRA、QLoRA微调方法,没有A100一样可以微调大模型(用3090 24G显存微调70亿参数的baichuan绰绰有余,甚至参数量小一点的模型3060也能跑&a…

基于电商场景的高并发RocketMQ实战-Broker写入读取流程性能优化总结、Broker基于Pull模式的主从复制原理

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

Windows实现MySQL5.7主从复制(详细版)

使用免安装版本(官网下载地址) 在Windows上安装两种MySQL服务并同时开启服务 1.下载配置 打开解压文件所在位置,就新建一个配置文件my.ini。 2.主库安装 主库的my.ini配置文件如下: [mysqld] #设置主库端口,注意须是…

UDP信号多个电脑的信息传输测试、配置指南

最近要做一个东西,关于一个软件上得到的信号,如何通过连接的局域网,将数据传输出去。我没做过相关的东西,但是我想应该和软件连接数据库的过程大致是差不多的,就一个ip和一个端口号啥的。 一.问题思路 多个设备同时连…

释放创造力的终极工具——Adobe Photoshop 2022 Mac/win

作为全球最受欢迎的图像处理软件,Adobe Photoshop一直是专业设计师和摄影师的首选工具。而最新推出的Adobe Photoshop 2022更是在功能和性能上迈出了重要的一步,为用户提供了更强大、更便捷的创作体验。 首先,Adobe Photoshop 2022引入了许多…

html table可编辑表格数据实现删除

这里教大家使用纯html和js脚本结合实现删除表格数据 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align: left;}</style> </head> <body…

5G阅信应用场景有哪些?

5G阅信的应用场景非常广泛&#xff0c;以下是一些常见的应用场景&#xff1a; 1.工业自动化&#xff1a;5G阅信可以连接各种工业设备和传感器&#xff0c;实现设备之间的实时通信和控制&#xff0c;提高生产效率和自动化水平。 2.物联网和智能家居&#xff1a;5G阅信可以连接各…

【每日一题】LeetCode206.反转链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1示例2示例3提示 2. 思路3.代码 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1…

文件夹改名方法:文件夹随机重命名的实用技巧,轻松管理

在日常生活和工作中&#xff0c;会遇到大量的文件夹要处理和管理。方便查找或分类&#xff0c;要对文件夹进行重命名。如果手动一个个重命名不仅耗时&#xff0c;还容易出错。现在一起来看看云炫文件管理器如何批量随机重命名文件夹&#xff0c;掌握这些技巧能更加轻松地应对工…

idea自动注释

前言 保存一下自己的自动注释代码 idea自动注释 前言1 创建类时&#xff0c;自动生成注释2 在方法上使用快捷键生成注释3 使用方法4 效果图 1 创建类时&#xff0c;自动生成注释 如下&#xff1a; #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package …

SParC数据集介绍

导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次&#xff0c;大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…