了解 instanceof 的模式匹配以及如何使用它从Java 14开始( JEP 305 )。这是JDK 14中的预览语言函数

如果应用程序需要处理某种类型的类,但是我们有超类类型的引用,那么我们需要检查该实例的类型并进行适当的转换。

例如, Customer 的类型可以为 BusinessCustomer PersonalCustomer 。根据客户实例的类型,我们可以根据上下文获取信息。

Customer customer = null;	//get this value from some method

String customerName = "";

//Old approach

if(customer instanceof PersonalCustomer)
{
	PersonalCustomer pCustomer = (PersonalCustomer) customer;	//Redundant casting
	customerName = String.join(" ", pCustomer.getFirstName(), 
					pCustomer.getMiddleName(), 
					pCustomer.getLastName());
}
else if(customer instanceof BusinessCustomer)
{
	BusinessCustomer bCustomer = (BusinessCustomer) customer;	//Redundant casting
	customerName = bCustomer.getLegalName();
}

现在,通过与instanceof匹配的模式,我们可以按以下方式编写类似的代码。在这里,我们可以减少类型转换的样板代码(例如,将 pCustomer 强制转换为 customer )。

//New approach

if(customer instanceof PersonalCustomer pCustomer)
{
	customerName = String.join(" ", pCustomer.getFirstName(), 
					pCustomer.getMiddleName(), 
					pCustomer.getLastName());
}
else if(customer instanceof BusinessCustomer bCustomer)
{
	customerName = bCustomer.getLegalName();
}

在下面的代码中,短语 String s 类型测试模式:

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

如果 obj String 的实例,则 instanceof 运算符会将目标 obj 与类型测试模式匹配,然后将其强制转换为 String 并分配给绑定变量 s

请注意,如果obj为 null ,则仅匹配模式,并且仅分配 s

例如,当我们添加&&运算符和另一个语句时,仅当instanceof成功并将其分配给pCustomer时,才会评估添加的语句。此外,true块中的pCustomer引用了封闭类中的一个字段。

//Works fine

if(customer instanceof PersonalCustomer pCustomer 
		&& pCustomer.getId() > 0)
{
	customerName = String.join(" ", pCustomer.getFirstName(), 
							pCustomer.getMiddleName(), 
							pCustomer.getLastName());
}

与上述情况相反,当我们添加 || 运算符和另一条语句时,绑定变量 pCustomer 不在 || 运算符,它也不在true块的范围内。此时的 pCustomer 引用了封闭类中的一个字段。

//Compiler error ::The pattern variable pCustomer is not in scope in this location

if(customer instanceof PersonalCustomer pCustomer 
		|| pCustomer.getId() > 0)
{
	customerName = String.join(" ", pCustomer.getFirstName(), 
					pCustomer.getMiddleName(), 
					pCustomer.getLastName());
}

这一章你学到了什么?来做个笔记,好记忆不如烂笔头! 如果觉得对您有帮助,麻烦帮分享给您的朋友😊😊

祝学习愉快!(如果觉得不正确,选中要修改的内容->右键->编辑)

点我分享笔记