JDK14 新特性

1、instanceof的模式匹配(预览)

通过对instanceof运算符进行模式匹配来增强Java编程语言。 模式匹配允许程序中的通用逻辑,即从对象中有条件地提取组件,可以更简洁,更安全地表示。 这是JDK 14中的预览语言功能。

 

几乎每个程序都包含某种逻辑,这些逻辑结合了对表达式是否具有某种类型或结构的测试,然后有条件地提取其状态的组件以进行进一步处理。 例如:

if (obj instanceof String) {
    String s = (String) obj;
    // use s
}

这段代码发生了三件事:一个测试(obj是一个String吗?),一个转换(将obj转换为String)以及一个新的局部变量的声明,以便我们可以使用字符串值。

这种模式很简单,并且所有Java程序员都可以理解,但是由于一些原因,它不是最优的。这很乏味;不需要进行类型测试和类型转换(在一个testof实例之后还要做什么?)。这个样板-尤其是String类型的三个出现-混淆了后面的更重要的逻辑。但最重要的是,重复为错误提供了机会,使错误不被察觉的出现在程序中。

我们认为Java不是实时接受模式匹配,不是寻求及时解决方案。模式匹配允许简洁地表达对象的所需“形状”(模式),并允许各种语句和表达式针对其输入来测试“形状”(匹配)。

从Haskell到C#,许多语言都出于其简洁性和安全性而接受了模式匹配。

 

模式是:(1)可以应用于目标的述语

           (2)仅在述语成功的应用于目标时才从目标中提取的一组绑定变量的组合。

类型测试模式由指定类型的谓词和单个绑定变量组成。

扩展instanceof运算符(JLS 15.20.2)以采用类型测试模式,而不仅仅是类型。 在下面的代码中String是类型测试模式:

if (obj instanceof String s) {
    // can use s here
} else {
    // can't use s here
}

instanceof运算符将目标obj与类型测试模式“匹配”,如下所示:如果obj是String的实例,则将其强制转换为String并分配给绑定变量s。 绑定变量在if语句的true块中,而不在if语句的false块中。

与局部变量的范围不同,绑定变量的范围由包含的表达式和语句的语义确定。例如,在此代码中:

if (!(obj instanceof String s)) {
    .. s.contains(..) ..
} else {
    .. s.contains(..) ..
}

true块中的s表示封闭类中的字段,false块中的s表示由instanceof运算符引入的绑定变量。 

 

当if语句的条件变得比单个instanceof更复杂时,绑定变量的范围也会相应地增长。例如,在此代码中:

if(obj instanceof String s && s.length()> 5){.. s.contains(..)..}
绑定变量s在&&运算符右侧以及true块中。 (仅当instanceof成功并分配给s时,才评估右侧。)另一方面,在此代码中:

if(obj instanceof String s || s.length()> 5){.. s.contains(..)..}
绑定变量s不在||右侧的范围内运算符,也不在true块的范围内。 (在这些点上指的是封闭类中的一个字段。)

目标为null时,instanceof的工作方式没有任何变化。也就是说,如果obj不为null,则仅匹配模式,并且仅分配s。

在instanceof中使用模式匹配应大大减少Java程序中显式强制转换的总数。此外,类型测试模式在编写相等方法时特别有用。

 

2、Records (Preview)

通过record增强Java编程语言。 记录提供了一种紧凑的语法来声明类,这些类是浅层不变数据的透明持有者。 这是JDK 14中的预览语言功能。

人们普遍抱怨“ Java太冗长”或“仪式过多”。为了正确地编写数据载体类,必须编写大量低价值,重复性且容易出错的代码:构造函数,get()、set(),equals(),hashCode(),toString()等。开发人员有时倾向于减少这些重要方法。

IDE将帮助在java类中编写大多数代码,但不会做任何事情来帮助读者从数十行代码中提取“我是x,y和z的数据载体”的设计意图。编写对简单聚合建模的Java代码应该更容易-编写,阅读和验证正确。

从表面上看,将record主要看作是减少样本量是诱人的,但是我们选择了一个更明确的目标:将数据建模为数据。 (如果语义正确,则样例将自行处理。)声明不可变的,行为良好的名义数据聚合应该很容易,清楚和简洁。

record是Java语言中一种新型的类型声明。像枚举一样,record是类的一种受限形式。它声明其表示形式,并提交与该表示形式匹配的API。record放弃了类通常享有的自由:将API与表示分离的能力。作为回报,record获得了很大程度的简洁性。

record具有名称和状态描述。状态描述是声明record的组成部分,record具有正文。例如:

record Point(int x, int y) { }

 

3、Helpful NullPointerExceptions(空指针异常提示)

 

 

 

未完待续。。。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值