• Java SE 14 新增特性


    Java SE 14 新增特性

    作者:Grey

    原文地址:

    博客园:Java SE 14 新增特性

    CSDN:Java SE 14 新增特性

    源码

    源仓库: Github:java_new_features

    switch 增强

    switch 表达式在 Java SE 12 和 Java SE 13 中一直是预览功能,现在在 Java SE 14 中成为正式功能

    1. Java SE 12中为 switch 表达式引入了 lambda 语法,从而允许匹配多个 case 标签。

    2. Java SE 13,引入了 yield 语句用于从表达式中返回值。

    代码见

    package git.snippets.jdk14;
    
    /**
     * switch 增强
     *
     * @author Grey
     * @date 2021/11/29
     * @since 14
     */
    public class SwitchInJdk14 {
        public static void main(String[] args) {
            test("apple");
            test2("june");
            System.out.println(test3("apple"));
            System.out.println(test3("abc"));
        }
    
        // 在jdk12是预览特性,在14正式引入
        static void test(String c) {
            switch (c) {
                case "apple", "Apple" -> System.out.println("苹果");
                case "banana", "Banana" -> System.out.println("香蕉");
    
            }
        }
    
        static void test2(String day) {
            String season = switch (day) {
                case "march", "april", "may" -> "春天";
                case "june", "july", "august" -> "夏天";
                case "september", "october", "november" -> "秋天";
                case "december", "january", "february" -> "冬天";
                default -> {
                    throw new RuntimeException("day error");
                }
            };
            System.out.println("当前季节是:" + season);
        }
    
    
        private static String test3(String c) {
            return switch (c) {
                case "apple", "Apple":
                    yield "苹果";
                case "banana":
                    yield "香蕉";
                default:
                    yield "无法识别";
            };
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    输出结果

    苹果
    当前季节是:夏天
    苹果
    无法识别
    
    • 1
    • 2
    • 3
    • 4

    instanceof 增强(预览功能)

    一个 instanceof 条件检查后一般会有一个类型转换。

    在 Java SE 14 之前

            // Before Java 14:
            if (obj instanceof H) {
                H jd1 = (H) obj;
                jd1.setId(1);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在 Java SE 14 中,可以简化为

            // Java 14+
            if (obj instanceof H jd2) {
                jd2.setId(1);
            }
    
    • 1
    • 2
    • 3
    • 4

    这个功能在 Java SE 14 中是预览功能。在 Java SE 14 环境下,需要启用 --enable-preview 才能运行代码。

    Records(预览功能)

    Records 是存储纯数据的数据类。使用 Records 是为了快速创建简单而简洁的类(不含模板代码)。

    通常,在 Java 中,一个类需要你实现equals()hashCode()getterssetters方法。虽然有些 IDE 支持自动生成这样的类,但代码仍然很冗长。有了 Records,你可以简单地定义一个不包括上述方法的类,示例代码如下

    package git.snippets.jdk14;
    
    /**
     * @author Grey
     * @date 2021/11/29
     * @since 14
     */
    public record Author(String name, String topic) {
    }
    // 或者
    //record Author(){}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用这个 record ,

    package git.snippets.jdk14;
    
    /**
     * Records在jdk14是预览功能
     * 到jdk16正式发布
     *
     * @author Grey
     * @date 2021/11/29
     * @since
     */
    public class RecordsTest {
        // record 是一种全新的类型,它本质上是一个 final 类,
        // 同时所有的属性都是 final 修饰,它会自动编译出 public get hashcode 、equals、toString 等方法,减少了代码编写量。
        public static void main(String[] args) {
            Author c1 = new Author("A", "B");
            Author c3 = new Author("A", "B");
            Author c2 = new Author("A", "B");
            System.out.println(c1);
            System.out.println(c2);
            System.out.println(c1 == c3);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    record 中可以定义方法和成员变量,例如

    record Author (int id, String name, String topic) {
        static int followers;
    
        public static String followerCount() {
            return "Followers are "+ followers;
        }
    
        public String description(){
            return "Author "+ name + " writes on "+ topic;
        }
    
        public Author{
        if (id < 0) {
            throw new IllegalArgumentException( "id must be greater than 0.");
         }
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    同时,record 也可以实现接口

    
    record Author(String name, String topic) implements Information {
      public String getFullName() {
        return "Author "+ name + " writes on " + topic;
      }
    }
    
    interface Information {
      String getFullName();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    支持多个构造函数

    record Author(String name, String topic) {
      public Author() {
    
        this("NA", "NA");
      }
    
      public Author(String name) {
    
        this(name, "NA");
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    它本质上是一个 final 类,同时所有的属性都是 final 修饰,它会自动编译出 public get hashcode 、equals、toString 等方法,减少了代码编写量。

    使用javap查看 record 的 class 文件,可以得到验证

    C:\Users\Young\Downloads>javac Author.java && javap Author
    Compiled from "Author.java"
    public final class Author extends java.lang.Record implements Information {
      public Author();
      public Author(java.lang.String);
      public Author(java.lang.String, java.lang.String);
      public java.lang.String getFullName();
      public final java.lang.String toString();
      public final int hashCode();
      public final boolean equals(java.lang.Object);
      public java.lang.String name();
      public java.lang.String topic();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Records 到 Java SE 16 正式发布,在 Java SE 14 中是预览功能。

    NullPointerException 提示信息优化

    如下代码:

    public class NullPointerTest {
        public static void main(String[] args) {
            String s = null;
            System.out.println(s.isEmpty());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在 Java SE 14 之前,报错信息如下

    Exception in thread "main" java.lang.NullPointerException
            at NullPointerTest.main(NullPointerTest.java:5)
    
    • 1
    • 2

    在 Java SE 14 后,优化了 NPE 的报错提示,在 Java SE 14 下执行,报错信息如下

    Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "" is null
            at NullPointerTest.main(NullPointerTest.java:5)
    
    • 1
    • 2

    会提示出具体哪个对象是 null。

    文本块(二次预览功能)

    文本块是在 Java SE 13 中作为预览功能引入的,目的是允许轻松创建多行字符串。这个功能在创建 HTML 和 JSON 或 SQL 查询字符串方面很有用。

    在Java SE 14 中,Text Blocks 仍处于预览阶段,并增加了一些新功能,增加了

    1. \结尾不换行

    2. \s表示一个空格

    示例代码

    package git.snippets.jdk14;
    
    /**
     * Block功能的二次预览
     * 到jdk15中正式发布
     *
     * @author Grey
     * @date 2021/11/29
     * @since 14
     */
    public class BlockInJdk14 {
        public static void main(String[] args) {
            String content = """
                    {
                        "hello": 1,\ 
                        "world": 2,
                        "hello world": "1\s2",
                    }
                     """;
            System.out.println(content);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出结果如下

    {
        "hello": 1,    "world": 2,
        "hello world": "1 2",
    }
    
    • 1
    • 2
    • 3
    • 4

    文本块功能在 Java SE 15 中正式启用。

    更多

    Java SE 7及以后各版本新增特性,持续更新中…

    参考资料

    JDK 14 Release Notes

    Java 14 Features

    Java 14 新功能介绍

  • 相关阅读:
    linux下文件操作命令
    1.3 Linux目录操作
    头哥的实践平台的Linux文件/目录管理
    .net 7 隐藏swagger的api
    春秋云境靶场CVE-2022-25578漏洞复现(利用htaccess文件进行任意文件上传)
    面试题--SpringBoot
    iOS App外包开发的内存泄露解决
    springboot集成UidGenerator
    快速入门ESP32——开发环境配置PlatformIO IDE
    计算机毕业设计Java计算机office课程平台(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/hotonyhui/article/details/126448327