首页 > 其他分享 >JDK12~17的新特性:Switch增强,优化NPE,文本块,instanceof增强,record,sealed

JDK12~17的新特性:Switch增强,优化NPE,文本块,instanceof增强,record,sealed

时间:2024-10-09 17:12:00浏览次数:8  
标签:instanceof String 17 NPE System sex println public name

JDK14

switch语句的增强:

类似lambda的语法糖,不需要再写break了。提供yield实现返回值

其中switch类型匹配属于预览,正常情况下是关闭的

public class EnhanceSwitch {
    public static void main(String[] args) {
        oldVersion();

        newVersion();
    }

    private static void oldVersion() {
        int num = 1;
        switch (num) {
            case -1:
            case 1:
                System.out.println("one");
                break;
            case 2:
                System.out.println("two");
                break;
            default:
                System.out.println("other");
                break;
        }
    }
    //1.不再使用break
    //2.支持返回值,yield关键字返回block内的数据
    //3.支持多个case合并

    private static void newVersion() {
        int num = -1;
        int newNum = switch (num) {
            case -1, 1 -> {
                System.out.println("one");
                yield 1;
            }
            case 2 -> {
                System.out.println("two");
                yield 2;
            }
            default -> {
                System.out.println("other");
                yield 0;
            }
        };
    }


}

优化NPE信息

jdk14之后会明确告诉你哪一行的具体哪个值发生了空指针异常

 

 

JDK15

文本块

像python的注释一样使用六个双引号即可生成文本块,减少了json块的复杂拼接,可使用string.formatted()为%s填充参数

在JDK17中新增了两个转义字符    \s:添加一个空格(在行尾手动无法实现)   \:让两行拼接在一起(其实手动也可以实现,但是使用这个在某些场景可以看起来更美观一些)

public class EnhanceTextBlock {
    public static void main(String[] args) {
        String name = "blaze";
        String sex = "man";
        String info = """
                name: %s \s\s\
                sex: %s
                """.formatted(name, sex);
        System.out.println(info);
    }
}

输出结果:

 

 

JDK16

instanceof增强:

instanceof的时候指定好new的对象的name即可,不需要在语句内再new对象

public class EnhanceInstanceof {
    public static void main(String[] args) {
        oldVersion();
        newVersion();
    }

    static void oldVersion(){
        Object o="abc";
        if(o instanceof String){
            String i=(String) o;
            System.out.println(i);
        }
    }
    static void newVersion(){
        Object o="abc";
        if(o instanceof String s){
            System.out.println( s.charAt(0));
        }
    }
}

 

record关键字

提供一种妄图代替lombok的关键字:可以快速实现一个javabean,只需要在构造时写清变量并赋值。注意,这些变量都是final的,不能再次赋值,不过可以对list这类集合新删改内部元素。

问题是一旦使用record后内部就不能再次赋值,也就是说适用于不变量的场景,此外它适用于处理一些中间的内部类,传递给下一个方法时比map让代码更清晰

编译前的.java

public record People(Integer id,String name, String sex) {
    public People{
        if(!sex.equals("男")&&!sex.equals("女")){
            throw new RuntimeException("在中国这样的性别不合法");
        }
    }
}

编译后的.class

public record People(Integer id, String name, String sex) {
    public People(Integer id, String name, String sex) {
        if (!sex.equals("男") && !sex.equals("女")) {
            throw new RuntimeException("在中国这样的性别不合法");
        } else {
            this.id = id;
            this.name = name;
            this.sex = sex;
        }
    }

    public Integer id() {
        return this.id;
    }

    public String name() {
        return this.name;
    }

    public String sex() {
        return this.sex;
    }
}

如何使用

public class TestRecord {
    public static void main(String[] args) {
        People record = new People(1,"LJK", "男");
        System.out.println(record.sex());
    }
}

 

 

JDK17

密封类

关键字sealed , permits , non-sealed。值得注意的是,一旦使用密封类,那么子类就需要和父类在同一个目录层级中不然就会报错:Class is not allowed to extend sealed class from another package

// sealed 是jdk17的新特性,密封类
// 通过sealed修饰的抽象类/接口,只能被指定的实现类继承
public sealed abstract class Person permits Man,Woman {
}
// final关键字继承seal后,该子类不能被其他类继承
public final class Man extends Person {
}
// 使用non-sealed关键字,表示该类可以被继承
public non-sealed class Woman extends Person{
}

 

标签:instanceof,String,17,NPE,System,sex,println,public,name
From: https://www.cnblogs.com/kun1790051360/p/18439284

相关文章

  • ElasticSearch7.17.3简介+centos7详细安装教程+Springboot整合ES
    一、ElasticSearch简介    官方地址:Elasticsearch:官方分布式搜索和分析引擎|Elastic1.1ElasticSearch简介        Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,同时是可扩展的数据存储和矢量数据库,能够应对日益增多的各种用例。作为......
  • 题解:SP6517 JOCHEF - Farmer Sepp
    一眼简单悬线法,而且有多倍经验,感觉这题被遗忘了,那我就拿下这个水紫吧!我们用a数组表示能向上延伸能到达的最大距离,依次遍历每一行,如果该位置为F,他可以从上一行转移过来,将a数组增加一,如果该位置为C,意味着这个位置不能成矩形,将a数组变为0。接下来进行悬线法的标准操作,设l......
  • 专栏简介:Java 17 深入剖析:从入门到精通
    Java17深入剖析:从入门到精通专栏简介在信息技术迅猛发展的今天,Java语言凭借其跨平台的特性、强大的生态系统以及丰富的社区支持,依然稳居开发者的首选。随着Java17的发布,Java语言引入了众多创新特性和改进,使得它在现代软件开发中更具优势。本专栏将为读者提供一个深......
  • SpringBoot的摄影服务选购系统-计算机毕业设计源码91794
    摘要随着社会数字化的发展,人们对个性化服务和体验的需求不断增加,摄影服务行业也面临着更多线上服务的需求。摄影服务选购系统应运而生,该系统是一款基于Java语言、SpringBoot框架和MySQL数据库的在线平台,旨在满足日益增长的摄影服务需求。其开发背景源于对摄影服务行业数字化......
  • 20222417 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容(1).掌握反汇编与十六进制编程器(2).能正确修改机器指令改变程序执行流程(3).能正确构造payload进行bof攻击2.实验过程(1).直接修改程序机器指令,改变程序执行流程将pwn1文件放入共享文件夹,后续在kali中使用,再将文件复制到实验文件夹share路径下找到本次实验所用的三个代码片......
  • P1736
    dp然而我们可以使用前缀和+暴搜,而且更好理解,同时复杂度约O(n2),能过#include<bits/stdc++.h>usingnamespacestd;intn,m,a[2505][2505],x[2505][2505],y[2505][2505],z[2505][2505],ans;booled_1[2505][2505],ed_2[2505][2505];intkan1(inti,intj){ intd=0; whi......
  • CVE-2021-41773目录穿越漏洞复现并利用得到flag
    前提概要首先!遇到一道题目,根据题意可知:这道题目存在CVE-2021-41773漏洞。​先来了解一下CVE-2021-41773的漏洞原理:漏洞原理CVE-2021-41773是一个影响ApacheHTTPServer(httpd)的安全漏洞,影响版本为2.4.49版本。它是一个路径遍历漏洞,如果文档根目录以外的文件不受requi......
  • 17级模块化多电平变流器(MMC)研究(Simulink仿真实现)
    ......
  • 【日记】医生拆线居然还能没拆干净(1796 字)
    正文早上拆线,医院的门诊登记簿上写名字排队。我前面人还挺多。不过医生问过前面的情况之后,就先给我做了,因为拆线快。等我到市里转车,吃过饭后才发现,那个医生拆线没拆干净……吃了饭感觉口腔里还是有奇怪的东西,那个粗糙的质感,确定是线头没错了……找了个酒店的卫生......
  • 极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8
    本分分享极狐GitLab补丁版本17.4.1、17.3.4、17.2.8的详细内容。近期,极狐GitLab专业技术团队正式发布了17.4.1、17.3.4、17.2.8版本。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLabSaaS,技术团队已......