Java SE 14 新增特性

作者:Grey

原文地址:Java SE 14 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode: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 <a href="mailto:410486047@qq.com">Grey</a>
* @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 "无法识别";
};
}
}

输出结果

苹果
当前季节是:夏天
苹果
无法识别

instanceof 增强(预览功能)

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

在 Java SE 14 之前

        // Before Java 14:
if (obj instanceof H) {
H jd1 = (H) obj;
jd1.setId(1);
}

在 Java SE 14 中,可以简化为

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

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

Records(预览功能)

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

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

package git.snippets.jdk14;

/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 14
*/
public record Author(String name, String topic) {
}
// 或者
//record Author(){}

使用这个 record ,

package git.snippets.jdk14;

/**
* Records在jdk14是预览功能
* 到jdk16正式发布
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @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);
}
}

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.");
}
}
}

同时,record 也可以实现接口


record Author(String name, String topic) implements Information {
public String getFullName() {
return "Author "+ name + " writes on " + topic;
}
} interface Information {
String getFullName();
}

支持多个构造函数

record Author(String name, String topic) {
public Author() { this("NA", "NA");
} public Author(String name) { this(name, "NA");
}
}

它本质上是一个 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();
}

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());
}
}

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

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

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

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "<local1>" is null
at NullPointerTest.main(NullPointerTest.java:5)

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

文本块(二次预览功能)

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

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

  1. \结尾不换行

  2. \s表示一个空格

示例代码

package git.snippets.jdk14;

/**
* Block功能的二次预览
* 到jdk15中正式发布
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @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);
}
}

输出结果如下

{
"hello": 1, "world": 2,
"hello world": "1 2",
}

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

更多

Java SE 7及以后各版本新增特性

参考资料

JDK 14 Release Notes

Java 14 Features

Java 14 新功能介绍

Java SE 14 新增特性的更多相关文章

  1. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  2. Java SE 9 新增特性

    Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  3. Java SE 12 新增特性

    Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  4. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  5. Java SE 15 新增特性

    Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  6. Java SE 16 新增特性

    Java SE 16 新增特性 作者:Grey 原文地址:Java SE 16 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  7. Java SE 19 新增特性

    Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...

  8. Java SE 10 新增特性

    Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  9. Java SE 11 新增特性

    Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

随机推荐

  1. Linux切换中英文输入

    使用xshell登录Linux服务器后,输入的命令正确但是提示命令不存在,这是什么鬼. 通过移动光标可以发现两种字体的宽度不一样 解决方法 shift + 空格 进行切换

  2. mysql数据恢复 根据旧备份的sql文件和当前data下的ibd文件恢复innodb引擎数据

    1.使用navicat fro mysql数据库工具进行恢复 2.将原有备份的sql文件导入数据库 3.新建一个空数据库 4将备份数据库的数据表复制到新建数据库(只复制表格式) 5.在命令行模式中 u ...

  3. SmartIDE v0.1.19 - 码云(Gitee)最有价值开源项目奖项、工作区策略、类虚拟机镜像VMLC、Server安装手册

    SmartIDE v0.1.19 (CLI Build 3909, Server Build 3890) 已经发布,本次Sprint主要完成2个重要特性,工作区策略和类虚拟机容器(VM Like Co ...

  4. 使用 Dapr JS SDK 让 Nest.js 集成 Dapr

    Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架. Dapr 中文手册:ht ...

  5. Java实用类(五) -Math类和指定范围的随机数

    1.Math类 java.lang.Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数) 和PI(圆周率) // 绝对值 System.out.println(Math.abs(-3. ...

  6. SAP APO-供需匹配

    供需匹配包含主要功能"匹配能力"(CTM)和一个用于分配库存的附加功能. 在高级计划和优化中,SDM组件为这些应用程序提供跨工厂供应策略- 生产计划和详细计划(PP / DS) 供 ...

  7. java常见的面试题(一)

    1.Collection 和 Collections 有什么区别? Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口 ...

  8. Nacos配置失败(java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all server)

    解决: nacos服务器过载,可以删掉nacos文件夹下的data文件夹,重新启动.

  9. Tapdata 实时数据中台在智慧教育中的实践

      摘要:随着教育信息化的推进,智慧校园建设兴起,但在实施过程中面临数据孤岛.应用繁多.数据再利用等方面挑战,而 Tapdata 的实时数据中台解决方案,能够高效地解决智慧校园实施中的基础数据问题. ...

  10. 配置git的ssh

    Linux,Windows就在git bash here里面输 ① 初始化git账户 git config --global user.name "Eisen" git confi ...