JDK17新特性,代码使用,作用详细讲解

目录

1.密封类和密封接口

        作用

        好处

        1. 密封类

        2. 密封接口

        3. 非密封类

        4.  抽象密封类 

2.模式匹配for instanceof

    JDK17前的jdk版本

    新JDK17 

   特性与优点

   使用示例

   注意事项

   作用

3.文本块

 作用

 好处

 代码实例

1. 基本语法:

2.换行和缩进:

3.包含引号:

4.换行符的自动处理:

5.使用表达式:

4.外部内存访问 API(Foreign Function & Memory API)

    作用

    好处

    示例:

         1. 分配和使用堆外内存

2. 外部函数调用(调用本地 C 函数)

5.新的 macOS 渲染器

    作用:

    好处:

6. 对 macOS/AArch64 的支持

    作用:

    好处:

7.防止特定的 JNI 方法链接

    作用

    好处:

8. 其他重要更新


 

1.密封类和密封接口

        作用

                密封类和密封接口允许开发者限制哪些类可以扩展或实现特定的类或接口,从而控制类型层次结构的完整性。

        好处

                提高代码的安全性和可维护性。

                使类型的意图更加明确,便于理解和使用。

        1. 密封类

                 密封类使用 sealed 关键字进行声明,并且使用 permits 列出允许的子类。

// 声明一个密封类 Shape,允许 Circle 和 Rectangle 作为子类
public sealed class Shape permits Circle, Rectangle {// 类体
}// Circle 类继承自 Shape
public final class Circle extends Shape {@Overridepublic String toString() {return "Circle";}
}// Rectangle 类继承自 Shape
public final class Rectangle extends Shape {@Overridepublic String toString() {return "Rectangle";}
}

        2. 密封接口

                  密封接口的实现方式与密封类类似,使用 sealed 关键字和 permits 列出允许的实现类。

                   

// 声明一个密封接口 Drawable,允许 Circle 和 Square 实现
public sealed interface Drawable permits Circle, Square {void draw();
}// Circle 类实现 Drawable 接口
public final class Circle implements Drawable {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}// Square 类实现 Drawable 接口
public final class Square implements Drawable {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}

        3. 非密封类

                  如果希望某个密封类的子类不受密封限制,可以使用 non-sealed 关键字。

// 声明一个密封类 Shape,允许 Circle 和其他非密封类
public sealed class Shape permits Circle, NonSealedShape {// 类体
}// Circle 类继承自 Shape
public final class Circle extends Shape {@Overridepublic String toString() {return "Circle";}
}// 允许其他类继承的非密封类
public non-sealed class NonSealedShape extends Shape {@Overridepublic String toString() {return "NonSealedShape";}
}// 允许其他类继承的类
public class Triangle extends NonSealedShape {@Overridepublic String toString() {return "Triangle";}
}

        4.  抽象密封类 

                 密封类也可以是抽象的,这样可以定义一些抽象方法,让子类实现这些方法。

                    

public sealed abstract class Shape permits Circle, Rectangle {public abstract double area();
}public final class Circle extends Shape {private final double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}public final class Rectangle extends Shape {private final double width;private final double height;public Rectangle(double width, double height) {this.width = width;this.height = height;}@Overridepublic double area() {return width * height;}
}

                

2.模式匹配for instanceof

    JDK17前的jdk版本

         在以前的 Java 版本中,使用 instanceof 检查一个对象的类型时,通常需要使用两步,

 使用 instanceof 检查对象的类型。强制类型转换为目标类型

       

if (obj instanceof String) {String str = (String) obj;  // 需要进行强制类型转换System.out.println(str.length());
}

    新JDK17 

      在 JDK 17 中,你可以直接在 instanceof 中进行模式匹配,这样就不需要显式地进行类型转换了。语法上,instanceof 现在可以在同一行中进行类型检查和声明:

    

if (obj instanceof String str) {  // 直接声明并转换System.out.println(str.length()); // 可以直接使用 str,无需强制转换
}

   特性与优点

        简化代码:减少了代码的冗余,使代码更加简洁易读。

        类型安全:消除了强制类型转换可能导致的 ClassCastException。

        可读性:让意图更加明确,代码的逻辑更加清晰。

   使用示例

        下面是一个具体的例子,展示如何使用模式匹配来处理不同类型的对象。

         

public class PatternMatchingExample {public static void printLength(Object obj) {if (obj instanceof String str) {  // 使用模式匹配System.out.println("String length: " + str.length());} else if (obj instanceof List<?> list) {System.out.println("List size: " + list.size());} else {System.out.println("Unknown type");}}public static void main(String[] args) {printLength("Hello, World!");  // 输出: String length: 13printLength(Arrays.asList(1, 2, 3));  // 输出: List size: 3printLength(42);  // 输出: Unknown type}
}

   注意事项

       Scope:在 if 语句块内,模式匹配引入的变量(如上例中的 str 和 list)是有效的,并且在这个作用域内可以直接使用。

      多重条件:你可以在 instanceof 语句中结合其他条件,保持简洁的代码风格。

   作用

         模式匹配 for instanceof 使得 Java 代码更加简洁、安全和易于理解。

3.文本块

 作用

    提供了一种更加简洁的方式来定义多行字符串,尤其适用于 JSON、XML 等格式的字符串。

 好处

    增强了字符串的可读性。

    减少了转义字符的使用,简化了字符串的书写。

 代码实例

         1. 基本语法

             文本块使用三个双引号(""")来定义,支持多行字符串,自动处理换行和缩进。

              

String textBlock = """This is a text block.It can span multiple lines.""";

         2.换行和缩进

              文本块会保留换行符,并且会自动去掉前导空白(也称为“缩进”),使得排版更加整洁。

               

String html = """<html><body><h1>Hello, World!</h1></body></html>""";

         3.包含引号:

             可以使用 """ 定义的文本块包含双引号,而无需转义。

             

String json = """{"name": "ChatGPT","version": "1.0"}""";

         4.换行符的自动处理

            文本块中的每一行都自动添加换行符,避免了使用 \n 的麻烦。

             

String poem = """The woods are lovely, dark and deep,But I have promises to keep,And miles to go before I sleep.""";

         5.使用表达式

             文本块可以与其他字符串连接使用,甚至可以包含插值表达式(需与字符串连接运算符一起使用)。

          

String name = "ChatGPT";
String greeting = """Hello, %s!Welcome to the world of Java Text Blocks.""".formatted(name);

4.外部内存访问 API(Foreign Function & Memory API)

    作用

         允许 Java 程序直接访问本地代码和外部内存。

    好处

          提高了与本地库交互的效率。

          提供了更好的安全性和可控性,避免了直接使用指针带来的问题。

    示例:

             1. 分配和使用堆外内存

                        Java 17 引入了 MemorySegment 类,用来表示一块堆外内存。你可以通过它分配、访问和释放内存。

               

import jdk.incubator.foreign.*;public class ForeignMemoryExample {public static void main(String[] args) {// 分配 100 字节的堆外内存try (MemorySegment segment = MemorySegment.allocateNative(100)) {// 获取内存地址MemoryAddress address = segment.baseAddress();// 在内存中写入数据segment.set(JAVA_INT, 0, 42);// 从内存中读取数据int value = segment.get(JAVA_INT, 0);System.out.println("Value read from foreign memory: " + value);}}
}

                        在这个示例中,我们使用 MemorySegment.allocateNative 方法分配了 100 字节的堆外内存,并使用 segment.setsegment.get 来进行内存的写入和读取。

             2. 外部函数调用(调用本地 C 函数)

                     使用外部内存 API,你可以通过 CLinker 来加载和调用本地代码中的 C 函数。

                    

import jdk.incubator.foreign.*;import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;public class ForeignFunctionExample {public static void main(String[] args) throws Throwable {// 获取 C 库中的 printf 函数SymbolLookup lookup = CLinker.systemLookup();MethodHandle printf = lookup.lookup("printf").orElseThrow(() -> new RuntimeException("printf not found"));// 调用 printf 函数printf.invokeExact("Hello, %s!\n", "World");}
}

                在这个例子中,我们通过 CLinker.systemLookup() 获取系统中可用的本地函数符号,并通过 lookup.lookup() 查找本地函数(这里是 printf)。然后,我们使用 MethodHandle 调用该函数。

5.新的 macOS 渲染器

    作用:

           改进了 AWT 渲染器,增强了在 macOS 上的图形和文本显示。

    好处:

         提高了 macOS 上的用户体验。

         更好的兼容性和性能。

6. 对 macOS/AArch64 的支持

    作用:

      增加了对 Apple Silicon(ARM 架构)的支持。

    好处:

        提高了在 Apple M1 等新设备上的性能。

        拓宽了 Java 应用的部署环境。

7.防止特定的 JNI 方法链接

    作用

            增强了对 Java Native Interface 的安全控制,防止不安全的 JNI 方法链接。

    好处:

           提高了 Java 应用程序的安全性。

            降低了潜在的安全风险。

8. 其他重要更新

        JEP 391:对 java.lang.invoke.MethodHandles 的增强。

        JEP 384:引入新的 API 用于简化多种 Java 功能的实现。

        JEP 390:允许使用 switch 表达式来进行更灵活的条件匹配。

 

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

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

相关文章

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…

Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)

文章目录 v-bind对样式控制的增强2.1 操作class2.1.1 语法2.1.2 对象语法2.1.3 数组语法2.1.4 使用2.1.5 Test 2.2 操作style2.2.1 语法2.2.2 使用2.2.3 Test v-bind对样式控制的增强 2.1 操作class 2.1.1 语法 <div> :class "对象/数组">这是一个div&l…

图片无损放大工具Topaz Gigapixel AI v7.4.4 绿色版

Topaz A.I. Gigapixel是这款功能齐全的图象无损变大运用&#xff0c;应用可将智能机拍摄的图象也可以有着专业相机的高质量大尺寸作用。你可以完美地放大你的小照片并大规模打印&#xff0c;它根本不会粘贴。它具有清晰的效果和完美的品质。 借助AIGigapixel&#xff0c;您可以…

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(3)

1.问题描述&#xff1a; compatibleSdkVersion升级到5.0.0&#xff08;12&#xff09;之后&#xff0c;调用坐标系转换API&#xff1a;map.convertCoordinate(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, { longitude: location.longitude, latitude:…

[Linux网络编程]01-网络基础

此部分为《计算机网络》理论基础&#xff0c;可简要了解 一.计算机网络体系结构 常见的体系结构 OSI体系结构(法律上的国际标准)&#xff1a;物理层->数据链路层->网络层->运输层->会话层->表示层->应用层 TCP/IP体系结构(事实上的国际标准)&#xff1a;…

web网页QQ登录

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>QQ登录ent</title> </head> <style>ul > li{list-style: none; } a …

【Linux】 Linux 释放内存脚本

在Linux系统中&#xff0c;通常不需要手动释放内存到操作系统&#xff0c;因为Linux内核会自动管理内存。不过在经常会遇到内存不足&#xff0c;系统应用运行效率低的情况 编写一个脚本来“释放”内存&#xff0c;可以通过调用sync命令同步磁盘&#xff0c;并通过echo命令写入特…

13.1 Linux_网络编程_TCP/UDP

字节序 1、概述 什么是字节序&#xff1a; 字节序就是字节的存储顺序&#xff0c;分为大端字节序和小端字节序。 大端字节序&#xff1a;低地址存高位&#xff08;网络&#xff09;小端字节序&#xff1a;低地址存低位&#xff08;主机&#xff09; 检验主机字节序模式&…

【Linux】-权限

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;深入代码世界&#xff0c;了解掌握 Linux 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​ 一、权限的概念 在Linux 中&…

开源图像超分ECBSR项目源码分析

相关介绍 项目GitHub地址&#xff1a;https://github.com/xindongzhang/ECBSR项目相关论文&#xff1a;https://www4.comp.polyu.edu.hk/~cslzhang/paper/MM21_ECBSR.pdf&#xff08;也可以点这里下载&#xff09;论文解读&#xff1a;Edge-oriented Convolution Block for Re…

秃姐学AI系列之:语义分割 + 数据集 | 转置卷积 + 代码

语义分割 语义分割将图片中的每个像素分类到对应的类别 通常来说现在的会议软件的背景虚化这个功能用的就是语义分割技术 无人车进行路面识别也是语义分割技术 语义分割 vs 实例分割 语义分割将图像划分为若干组成区域&#xff0c;这类问题的方法通常利用图像中像素之间的相关…

go中阶乘实现时递归及迭代方式的比较

package mainimport ("fmt""time""math/big" )// 使用递归和 big.Int 计算阶乘 func FactorialRecursive(n *big.Int) *big.Int {if n.Cmp(big.NewInt(0)) 0 {return big.NewInt(1)}return new(big.Int).Mul(n, FactorialRecursive(new(big.Int…

基于Multisim三极管B放大系数放大倍数测量电路设计(含仿真和报告)

【全套资料.zip】三极管B放大系数放大倍数测量电路电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.用三个数码管显示B的大小&#xff0c;分别显示个位、十位和百位。 2.显示范围…

【论文精炼分享】GPU Memory Exploitation for Fun and Profit 24‘USENIX

今天分享的论文《GPU Memory Exploitation for Fun and Profit》来自2024年USENIX Security。在本文中&#xff0c;作者团队对 CUDA 程序中的缓冲区溢出问题进行了全面的研究&#xff1a; &#xff08;1&#xff09;对用于访问各种 GPU 内存空间的机制进行了逆向工程&#xff…

纯css 轮播图片,鼠标移入暂停 移除继续

核心 滚动&#xff1a; animation: 动画名称 20s linear infinite normal;停止&#xff1a; animation: 动画名称 20s linear infinite paused; 完整例子&#xff1a; html: <div class"carousel-wrapper"><div class"carousel"><div cl…

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说…

ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误

让工作生活更高效&#xff1a;Parallels Desktop 20最新版本虚拟机的神奇之处 大家好&#xff01;&#x1f44b; 今天我要跟大家安利一款让我工作效率飞升的神器——Parallels Desktop 20最新版本虚拟机。作为一个日常需要在不同操作系统间来回穿梭的人&#xff0c;这款软件简直…

算法的学习笔记—(牛客JZ50)

&#x1f600;前言 在处理字符串时&#xff0c;寻找第一个只出现一次的字符是一项常见的任务。本文将探讨几种有效的解法&#xff0c;包括使用 HashMap 和位集&#xff08;BitSet&#xff09;。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f970;第一个只出现…

生命科学的前沿挑战与未来机遇

生命科学的前沿挑战与未来机遇 一、引言 21世纪被誉为生命科学的世纪&#xff0c;生命科学的迅猛发展为人类的健康、环境和社会经济带来了巨大的变革。从基因编辑技术的突破&#xff0c;到合成生物学的兴起&#xff0c;再到生物医药的快速进步&#xff0c;生命科学的前沿挑战…