Java 14于2020年3月17日全面发布。在JDK14中新增了以下16个新特性:
- 305: instanceof的模式匹配 (预览)
- 343: 打包工具 (Incubator)
- 345: G1的NUMA内存分配优化
- 349: JFR事件流
- 352: 非原子性的字节缓冲区映射
- 358: 友好的空指针异常
- 359: Records (预览)
- 361: Switch表达式 (标准)
- 362: 弃用Solaris和SPARC端口
- 363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
- 364: macOS系统上的ZGC
- 365: Windows系统上的ZGC
- 366: 弃用ParallelScavenge + SerialOld GC组合
- 367: 移除Pack200 Tools和API
- 368: 文本块 (第二个预览版)
- 370: 外部存储器API (Incubator)
通过上述新特性,我们可以看出其中363、364、365、366都是关于垃圾回收器的。其中363已经明确弃用CMS垃圾收集器。而其中针对开发过程中可见的特性包括:instanceof模式匹配、Switch表达式、文本块等。下面我们就来体验一下编程过程中能用到语法形式。
目录
1.instanceof的模式匹配(预览)
Object obj = "java14";
//测试
if (obj instanceof String sss && sss.length() > 5) {
System.out.println(sss.contains("b"));
System.out.println("这是字符串!sss" + sss);
} else {
System.out.println("其他~");
}
在 instanceof 后面直接可以转换类型, 不用再将Object转成String,言简意赅。
2.文本块(第二预览)
在Java中,文本块是多行字符串文字。这意味着我们不需要陷入混乱的显式行终止符,字符串连接以及分隔符的情况,而这些分隔符通常用于编写普通的字符串文字。文本块包含多行文本,并使用三个双引号字符(”””)作为其开始和结束定界符。
由文本块生成的实例的类型java.lang.String与传统的双引号字符串相同。这包括对象表示和插入字符串池。
同样,可以在使用字符串文字的任何地方使用文本块。例如,我们可以将其用于字符串连接。
String string = "Hello";
String textBlock = """
World""";
String joinedString = string + textBlock;
System.out.println(joinedString);
3.有用的NullPointerExceptions
以前的空指针只会定位到一行(生产环境让人抓狂),现在可以定位到具体的哪一个对象为null。
注意:调试时候需要加参数: -XX:+ShowCodeDetailsInExceptionMessages
public class HelpfulNullPointerException
{
public static void main(String[] args)
{
Employee e = null;
System.out.println(e.getName());
}
}
控制台-带有改进细节的错误消息
Exception in thread "main" java.lang.NullPointerException:
Cannot invoke "com.howtodoinjava.core.basic.Employee.getName()" because "e" is null
at com.howtodoinjava.core.basic.HelpfulNullPointerException.main
(HelpfulNullPointerException.java:9)
4.Records (预览)
record type已在Java 14中作为预览功能引入,并且将用作在类和应用程序之间进行数据传输的普通不可变数据类。
像enum一样,record也是Java中的一种特殊的类类型。它旨在用于仅创建类以充当纯数据载体的地方。
类和记录之间的重要区别在于,记录旨在消除设置和从实例获取数据所需的所有样板代码。记录将这种责任转移到Java编译器,该Java编译器生成构造函数,字段getter,hashCode()和equals()以及toString()方法。
public record EmployeeRecord(Long id,
String firstName,
String lastName,
String email,
int age) {
}
5.Switch表达式 (标准)
在Java 14中,使用switch表达式,整个switch块“获取一个值”,然后可以在同一语句中将其分配给变量。
它支持多个大小写标签,并yield用于代替旧return关键字返回值。如果是enum,我们可以跳过这种default情况。如果存在某些情况下无法处理的缺失值,编译器将进行投诉。在所有其他表达式类型(int,字符串等)中,我们还必须提供default大小写。
public static Boolean isWeekDay (Day day)
{
Boolean result = switch(day) {
case MON, TUE, WED, THUR, FRI ->
{
System.out.println("It is WeekDay");
yield true;
}
case SAT, SUN ->
{
System.out.println("It is Weekend");
yield false;
}
};
return result;
}
6.更多功能
当然,java14还有许多其他特性的优化,比如垃圾回收器的ParallelScavenge + SerialOld的弃用等。但在使用之前,还是需要慎重,毕竟很多特性都只是作为预览特性出现。
本文来自转载,原文链接: