跟上六个月的周期传统,2019年9月17日发布的Java 13之后,另一个非LTS版本将于2020年3月17日发布。
Java 14 功能
以下是 Java 14 功能列表:
- 交换表达式(标准) - JEP 361
- 模式匹配为 instanceof (预览) - JEP 305
- 有用的 NullPointerExceptions - JEP 358
- 记录(预览) - JEP 359
- 文本块(第二预览) - JEP 368
- 包装工具(Incubator) - JEP 343 NUMA-A 记忆分配为 G1 - JEP 345(
Java 14 安装在 Mac OS 上
- 要開始使用 Java 14,請從 這裡下載 JDK。
- 如下所示,將 tar 檔案複製並提取到
/Library/Java/JavaVirtualMachines
。
1$ cd /Library/Java/JavaVirtualMachines
2
3$ sudo cp ~/Downloads/openjdk-14_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines
4
5$ sudo tar xzf openjdk-14_osx-x64_bin.tar.gz
6
7$ sudo rm openjdk-14_osx-x64_bin.tar.gz
一旦完成,请使用任何文本编辑器打开bash_profile
。我正在使用vim ~/.bash_profile
。设置 Java14 到 JAVA_HOME 的路径,保存更改并执行源 ~/.bash_profile
以反映更改。
1export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home
最后,你已经准备好使用Java14编译和运行程序了。我们将使用JShell(/community/tutorials/java-repl-jshell),一个交互式的REPL命令行工具,以快速测试新的Java 14功能。
重要的是要注意,在Java 14中发布的许多功能都在预览中,这意味着虽然它们现在完全工作,但未来可能会发生更改,有些功能可能会成为标准,或者在下一个版本周期中被删除,为了测试预览功能,您需要在运行JShell或Java程序时明确设置--enable-preview
,如下所示:
1jshell --enable-preview
2
3javac --release 14 --enable-preview Author.java
在接下来的几节中,让我们讨论一些语言和JVM功能。
推荐阅读: 安装Java 14在Linux上
1、交换表达式
在过去两次发布中保持预览功能后,切换表达式 - Java 12 和 Java 13 终于在 Java 14 中获得了永久状态。
- Java 12引入了 switch 表达式的 lambda 语法,从而允许多个案例标签进行模式匹配,并防止导致 verbose 代码的失败。
Java 14 终于使这些功能成为了标准。
1String result = switch (day) {
2 case "M", "W", "F" -> "MWF";
3 case "T", "TH", "S" -> "TTS";
4 default -> {
5 if(day.isEmpty())
6 yield "Please insert a valid day.";
7 else
8 yield "Looks like a Sunday.";
9 }
10
11 };
12System.out.println(result);
** 注意**: Yield 不是 Java 中的一个新关键字,它只是在交换表达式中使用。
2. 模式匹配 for instanceof (预览)
请任何Java开发人员显示他们的代码库,你会在整个代码中使用instanceof
条件。
Java 14 通过使条件提取更加简洁来摆脱这种词汇性。
Java 14 之前:**
1if (obj instanceof Journaldev) {
2 Journaldev jd = (Journaldev) obj;
3 System.out.println(jd.getAuthor());
4}
Java 14 向前:
1if (obj instanceof Journaldev jd) {
2 System.out.println(jd.getAuthor());
3}
在上面的代码中,jd
的实例只会被分配到obj
的类型为Journaldev
。
3. 有用的 NullPointer例外
Null Pointer 例外对任何开发人员来说都是噩梦,以前,直到 Java 13 之前,对臭名昭着的 NPEs 进行调试是非常困难的,开发人员不得不使用其他调试工具或手动计算变量/方法为 null,因为堆栈跟踪只会显示行数。
Java 14 之前:**
1String name = jd.getBlog().getAuthor()
2
3//Stacktrace
4Exception in thread "main" java.lang.NullPointerException
5 at NullPointerExample.main(NullPointerExample.java:5)
Java 14 引入了一种新的 JVM 功能,通过更为描述性的堆栈提供更好的见解,如下所示:
1Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Journaldev.getBlog()" is null
2 at NullPointerExample.main(NullPointerExample.java:4)
**注:上述功能不是语言功能,是运行时环境的增强。
记录(预览)
记录是一个存储纯数据的数据类,引入记录背后的想法是快速创建没有锅板代码的简单而简洁的类。
通常情况下,Java 中的一个类会要求你执行‘equals()’、‘hashCode()’、 getters 和 setters 方法,而一些 IDEs 支持这些类的自动生成,但代码仍然是无语的。
1record Author(){}
2//or
3record Author (String name, String topic) {}
Java 编译器将自动生成构建器、私人终端字段、配件、‘equals’/‘hashCode’ 和‘toString’ 方法。
要查看生成的代码,请使用javap Author
在使用javac
编译程序后。下图显示了生成的类为`record Author(字符串名称,字符串主题) {}:
记录的语义类似于Kotlin中的数据类(/社区/教程/kotlin-data-class)
此外,我们可以如下方式将额外的字段、方法和构建器添加到记录中:
1record Author (int id, String name, String topic) {
2 static int followers;
3
4 public static String followerCount() {
5 return "Followers are "+ followers;
6 }
7
8 public String description(){
9 return "Author "+ name + " writes on "+ topic;
10 }
11
12 public Author{
13 if (id < 0) {
14 throw new IllegalArgumentException( "id must be greater than 0.");
15 }
16 }
17}
记录内定义的附加构造器称为紧凑构造器. 它不包括任何参数,而只是 Canonical 构造器的延伸。
一个紧凑的构建器不会被编译器作为一个单独的构建器生成,相反,它被用于验证案例,并在主构建器的开始时被引用。
关于记录要注意的一些重要事项:
一个记录既不能扩展一个类,也不能被另一个类扩展。它是最终的类 *记录不能抽象 *记录不能扩展任何其他类,也不能定义体内的实例字段。
推荐阅读: [Java 记录]( / 社区 / 教程 / Java 记录类)
4.1)记录的参考字段中的值可变异
重要的是要注意,对于被定义为对象的字段,只有引用是不可变的。 可以更改底层值。 下图显示了一个记录,其中 ArrayList 被更改。
4.2) 记录可以实现接口
下面的代码显示了与记录实施一个 [接口]( / 社区 / 教程 / 接口-in-java)的例子:
1record Author(String name, String topic) implements Information {
2 public String getFullName() {
3 return "Author "+ name + " writes on " + topic;
4 }
5}
6
7interface Information {
8 String getFullName();
9}
以下是上面的代码在 JShell 中执行的输出:
4.3 记录支持多个构建器
记录允许以或没有参数声明多个构建者,如下所示:
1record Author(String name, String topic) {
2 public Author() {
3
4 this("NA", "NA");
5 }
6
7 public Author(String name) {
8
9 this(name, "NA");
10 }
11}
4.4)记录允许更改配件方法
虽然记录确实会为状态描述中定义的字段生成公共附加方法,但它们还允许您重新定义附加方法,如下所示:
1record Author(String name, String topic) {
2 public String name() {
3 return "This article was written by " + this.name;
4 }
5}
4.5)在运行时检查记录及其组件
记录为我们提供 isRecord()
和 getRecordComponents()
来检查类是否是一个记录,并查看其字段和类型。
虽然我们在上面的代码示例中向记录添加了额外的字段和方法,但请确保您不会夸大这一点。
文本块(预览)
文本块是作为Java 13的预览功能引入的,其目的是轻松创建多行字符串字符串,方便创建HTML和JSON或SQL查询字符串。
在Java 14中,文本块仍在预览中,有一些新增。
- Backslash 用于显示漂亮的多行字符串块
s
用于考虑由编译器默认地忽略的后续空间。
1String text = """
2 Did you know \
3 Java 14 \
4 has the most features among\
5 all non-LTS versions so far\
6 """;
7
8String text2 = """
9 line1
10 line2 \s
11 line3
12 """;
13
14String text3 = "line1\nline2 \nline3\n"
15
16//text2 and text3 are equal.
此分類上一篇: OpenJDK 14