JDK17新增语法特性

news2024/9/21 13:27:36

JDK17新增语法特性

  • 前言
  • 新增语法特性
    • yield关键字
    • var关键字
    • 密封类
    • 接口中的私有方法
    • instanceof
    • 其他

前言

从springboot3.0开始,已经不支持JDK8,转变为JDK17
参考资料: 官方博客

新增语法特性

yield关键字

yield关键字从JDK13开始引入,yield关键字用于从case的代码块中返回值。
正常的switch语句:

public class Test {
    public static void main(String[] args) {
        String data = "ONE";
        int ret;
        switch(data){
            case "ONE":
                ret = 1;
                break;
            case "TWO":
                ret = 2;
                break;
            case "THREE":
                ret = 3;
                break;
            default:
                ret = -1;
                break;
        }
        System.out.println(ret);
    }
    //结果是:
    //1
}

简化后的switch语句

public class Test {
    public static void main(String[] args) {
        String data = "TWO";
        int ret = switch(data){
            case "ONE"->1;
            case "TWO"->2;
            case "THREE"->3;
            default->-1;
        };
        System.out.println(ret);
    }
    //结果是:
    //2
}

如果不想使用指向符->可以使用yield来代替:

public class Test {
    public static void main(String[] args) {
        String data = "TWO";
        int ret = switch(data){
            case "ONE" : yield 1;
            case "TWO" : yield 2;
            case "THREE": yield 3;
            default: yield -1;
        };
        System.out.println(ret);
    }
    //结果是:
    //2
}

var关键字

从java10开始,var被引入

var name = "zhangsan";
var age = 10;

上述代码中, 编译器会自动推断出name是一个String类型,age是一个int类型。
为什么使用var?
使用var可以使代码更简洁,有时候,类型的名称可能会非常长,例如泛型。var就像是一个简化器,让你不必反复写出繁琐的类型名。

public class Test {
    public static void main(String[] args) {
        Map<String, List<Map<Integer, String>>> complexMap = new HashMap<String,
                List<Map<Integer, String>>>();
        var complexMap2 = new HashMap<String, List<Map<Integer, String>>>();
    }
}   

使用注意事项:

  • 不能使用var来声明字段
  • 不能使用var来声明方法参数
  • 不能使用var来声明方法返回类型
  • var声明变量必须初始化,但是不能初始化为null
class Cat{
    public var name;    //error
    public var eat(var str){    //error

    }

    public static void main(String[] args) {
        var a = 1;
        System.out.println(a);
        
        var b = null;   //error
    }
}

密封类

密封类一般应用在类和接口中,对接口和类的实现和继承进行约束,主要使用的关键字是final,当这个类被final修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。
JDK17提供了一个关键字:sealed。密封类除了可以被该关键字修饰,并且在声明末尾使用permits表示要开放给哪些类型。
下述代码Animal为密封类,然后用permits关键字,把继承权限开放给Dog类

sealed class Animal permits Dog{
    public String name;
    public int age;
    public void eat(String name){
        System.out.println(name + "正在吃......");
    }
}
//继承的类也要加上密封限制 non-sealed 表⽰不限制
non-sealed class Dog extends Animal{
    public void eat(String name){
        System.out.println(name + "正在吃狗粮");
    }
}

注意:

  • sealed修饰的类必须有子类
sealed class Animal permits Dog{
    public String name;
    public int age;
    public void eat(String name){
        System.out.println(name + "正在吃......");
    }
}
sealed class Dog extends Animal{
    public void eat(String name){
        System.out.println(name + "正在吃狗粮");
    }
}
//编译器报错:Sealed class must have subclasses,此时Dog被sealed修饰,那么Dog必须要有子类
  • 使用non-sealed关键字修饰。表示不限制,任何类都可以继承。
sealed class Animal permits Dog{
    public String name;
    public int age;
    public void eat(String name){
        System.out.println(name + "正在吃......");
    }
}
//继承的类也要加上密封限制 non-sealed 表⽰不限制
non-sealed class Dog extends Animal{
    public void eat(String name){
        System.out.println(name + "正在吃狗粮");
    }
}
  • 未被permits允许的类型,则没办法继承
sealed class Animal permits Dog{
    public String name;
    public int age;
    public void eat(String name){
        System.out.println(name + "正在吃......");
    }
}
non-sealed class PetDog extends Animal{

}
//编译器报错:'PetDog' is not allowed in the sealed hierarchy

正确的做法可以改为:

sealed class Animal permits Dog,PetDog{
    public String name;
    public int age;
    public void eat(String name){
        System.out.println(name + "正在吃......");
    }
}
non-sealed class Dog extends Animal{
    public void eat(String name){
        System.out.println(name + "正在吃狗粮");
    }
}
non-sealed class PetDog extends Animal{

}
  • 复杂的特殊写法:
sealed class Animal permits Dog,PetDog,Cat{
    public String name;
    public int age;
    public void eat(String name){
        System.out.println(name + "正在吃......");
    }
}
sealed class Cat extends Animal permits PetCat{
}
non-sealed class PetCat extends Cat{
}

接口中的私有方法

public interface IHelloService {
    public void sayHello();
    //默认方法
    default void saySomething(){
        sayHello();
        sayEngHello();
    }
    //私有方法
    private void sayEngHello(){
        System.out.println("Hello!");
    }
}

instanceof

比如以下常见的代码:

if(obj instanceof String){
	String str = (String)obj;
	...

上面的instanceof一共做了三件事:

  1. 判断是否为String类型;
  2. 如果是,转换成String类型;
  3. 创建一个名为str的临时变量;

在JDK16中,使用模式匹配思想改进了instanceof用法,可以做到以下优化效果:

if(obj instanceof String str){	//obj是否为String类型,如果是创建临时变量str
	
}

其他

还有很多,需要我们后续继续了解和学习

  • ZGC-新一代垃圾回收器、G1垃圾回收器相关等等
  • record类的使用
  • Stream API的部分改进
  • HttpClient重写了,支持HTTP2.0
  • 支持了List.of()、Set.of()、Map.of()和Map.ofEntries()等⼯⼚⽅法实例化对象
  • 等等…

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

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

相关文章

【linux008】目录操作命令篇 - rmdir 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 rmdir 是 Linux 系统中的一个命令&#xff0c;用于删除空目录。它只能删除 空目录&#xff0c;如果目录中存在文件或子目录&#xff0c;则无法删除。 1、基本用法 rmdir [选项] 目录名...2、常见选项 -p, --parents&…

1.4 MySql配置文件

既然我们开始学习数据库&#xff0c;就不能像大学里边讲数据库课程那样简单讲一下&#xff0c;增删改查&#xff0c;然后介绍一下怎么去创建索引&#xff0c;怎么提交和回滚事务。我们学习数据库要明白怎么用&#xff0c;怎么配置&#xff0c;学懂学透彻了。当然MySql的配置参数…

关于群里脱敏系统的讨论2024-09-20

群里大家讨论脱敏系统&#xff0c;傅同学&#xff1a;秦老师&#xff0c;银行数据脱敏怎么做的&#xff0c;怎么存储的&#xff1f; 采购了脱敏系统&#xff0c;一般是硬件&#xff08;厂商直接卖的一体机&#xff09;。这个系统很复杂&#xff0c;大概卖50-100万一台。 最核…

为什么消费还能返利?2024年全新返利模型!

在当今竞争激烈的电商市场中&#xff0c;一种名为“循环购”的创新商业模式正悄然兴起&#xff0c;以其独特的消费返利机制和积分体系&#xff0c;为消费者带来了前所未有的购物体验 一、循环购模式&#xff1a;消费即投资的智慧选择 循环购模式并非简单的消费行为&#xff0c…

MySQL | 知识 | 从底层看清 InnoDB 数据结构

文章目录 一、InnoDB 简介InnoDB 行格式COMPACT 行格式CHAR(M) 列的存储格式VARCHAR(M) 最多能存储的数据记录中的数据太多产生的溢出行溢出的临界点 二、表空间文件的结构三、InnoDB 数据页结构页页的概览Infimum 和 Supremum使用Page Directory页的真实面貌 四、B 树是如何进…

重生奇迹MU 强化玩法套路多 极品装备由你打造

欢迎来到重生奇迹MU的强化玩法指南&#xff01;想要打造极品装备吗&#xff1f;不可错过这篇文章&#xff0c;我们将为您揭开最多套路的强化技巧和窍门&#xff0c;帮您节省时间和资源&#xff0c;并带来最高效的升级结果。无论您是新手还是老玩家&#xff0c;本文适合所有级别…

基于MySQL全量备份+GTID同步的主从架构恢复数据至指定时间点

系列文章目录 基于GTID同步搭建主从复制 MySQL全量备份 文章目录 系列文章目录前言一、环境准备二、构建测试数据1.安装sysbench2.构建测试数据3.准备全量备份4.将全量备份和binlog拷贝到临时数据库服务器5.模拟误删除表操作 三、恢复数据到指定时间点1.临时数据库恢复数据2.找…

【Delphi】中的数据绑定(LiveBindings)

LiveBindings 是 RAD Studio 中 VCL 和 FireMonkey 框架都支持的数据绑定功能。 LiveBindings 是一个基于表达式的框架&#xff0c;这意味着它使用绑定表达式将对象绑定到其他对象或数据集字段。 LiveBindings 概述 LiveBindings 基于关系表达式&#xff0c;即绑定表达式&am…

react 甘特图之旅

react-gantt GitHub 仓库: https://github.com/clayrisser/react-gantt react-gantt-chart GitHub 仓库: https://github.com/MaTeMaTuK/gantt-task-react easy-gant-beta GitHub 仓库: https://github.com/web-widgets/react-gantt-demos 上面的版本不兼容 dhtmlx-gant…

一周热门|比GPT-4强100倍,OpenAI有望年底发布GPT-Next;1个GPU,1分钟,16K图像

大模型周报将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 01 企业动态 Ilya 新公司 SSI 官宣融资 10 亿美元 据路透社报道&#xff0c;由 OpenAI 联合创始人、前首席科学家 Ilya Sutskever 在 2 个多月前共同创…

抖音如何改ip地址到另外城市

在数字化时代&#xff0c;抖音作为广受欢迎的社交媒体平台&#xff0c;不仅连接了亿万用户&#xff0c;也成为了展示个人生活、分享创意内容的重要舞台。然而&#xff0c;有时候出于隐私保护等需求&#xff0c;用户可能希望更改抖音账号显示的IP地址&#xff0c;使其看起来像是…

奇安信渗透2面经验分享

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

泛微E9开发 创建自定义浏览框,关联物品管理表【1】

创建自定义浏览框&#xff0c;关联物品管理表【1】 1、自定义浏览框1.1 概念1.2 前端样式 2、创建物品管理表2.1 新建建模表单操作方法2.2 物品管理表 3、创建浏览按钮 1、自定义浏览框 1.1 概念 自定义浏览框可以理解为是建模引擎中的表与表关联的一个桥梁。比如利用建模引擎…

【学习笔记】数据结构(六 ①)

树和二叉树 &#xff08;一&#xff09; 文章目录 树和二叉树 &#xff08;一&#xff09;6.1 树(Tree)的定义和基本术语6.2 二叉树6.2.1 二叉树的定义1、斜树2、满二叉树3、完全二叉树4、二叉排序树5、平衡二叉树&#xff08;AVL树&#xff09;6、红黑树 6.2.2 二叉树的性质6.…

2024“智衡屋” 智能感知挑战赛决赛即将来袭

2024“智衡屋” 智能感知挑战赛决赛将于 2024 年 9 月 24 日在安徽省合肥市举行&#xff0c;决赛将作为 2024 年中国计量测试学会首届人工智能计量学术大会的重要环节率先举行。 2024“智衡屋” 智能感知挑战赛自启动以来&#xff0c;吸引了700余支高校学生、科研机构研究人员以…

Spring Boot框架在心理教育辅导系统中的应用

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

weblogic CVE-2018-2894 靶场攻略

漏洞描述 Weblogic Web Service Test Page中⼀处任意⽂件上传漏洞&#xff0c;Web Service Test Page 在 "⽣产模式"下默认不开启&#xff0c;所以该漏洞有⼀定限制。 漏洞版本 weblogic 10.3.6.0 weblogic 12.1.3.0 weblogic 12.2.1.2 28 weblogic 12.2.1.3 …

ChromaDB教程_2024最新版(下)

前言 Embeddings&#xff08;嵌入&#xff09;是表示任何类型数据的AI原生方式&#xff0c;它非常适用于各种AI驱动的工具和算法中。它们可以表示文本、图像&#xff0c;很快还可以表示音频和视频。有许多创建嵌入的选项&#xff0c;无论是在本地使用已安装的库&#xff0c;还是…

LabVIEW 可以同时支持脚本编程和图形编程

LabVIEW 可以同时支持脚本编程和图形编程&#xff0c;但主要依赖其独特的 图形编程 环境&#xff08;G语言&#xff09;&#xff0c;其中程序通过连线与节点来表示数据流和功能模块。不过&#xff0c;LabVIEW 也支持通过以下方式实现脚本编程的能力&#xff1a; 1. 调用外部脚本…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 三(61-)

环境&#xff1a;OpenCV3.2.0 VS2017 61、轮廓集合重排序(按轮廓面积从小到大) //对轮廓集合面积从大到小排序 bool compareValue_bs(const std::vector<cv::Point> & c1, const std::vector<cv::Point> & c2) {int area1 cv::contourArea(c1);int area…