Java 14 功能

跟上六个月的周期传统,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);

Java 14 Switch Expressions

** 注意**: 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(字符串名称,字符串主题) {}:

Javap Records Java 14

记录的语义类似于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 被更改。

Java 14 Records Mutable Values For References

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 中执行的输出:

Java 14 Records With Interface

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 14 Records Runtime Check

虽然我们在上面的代码示例中向记录添加了额外的字段和方法,但请确保您不会夸大这一点。

文本块(预览)

文本块是作为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

Published At
Categories with 技术
Tagged with
comments powered by Disqus