Java14发布了,有啥新特性呢( 四 )



这种更简洁的语法可以去掉Java程序里的大多数强制类型转换。(2011年的一篇针对相关语言特性的研究论文(http://www.cs.williams.edu/FTfJP2011/6-Winther.pdf)指出,24%的类型转换都来自于instanceof后的条件语句。)
JEP 305解释了这项改变,并给出了Joshuoa Bloch的著作《Effective Java》中的一个例子,演示了下面两种等价的写法:
@Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString) \u0026amp;\u0026amp; ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);}
这段代码中冗余的CaseInsensitiveString强制类型转换可以去掉,转换成下面的方式:
@Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString cis) \u0026amp;\u0026amp; cis.s.equalsIgnoreCase(s);}这个预览特性很值得尝试,因为它打开了通向更通用的模式匹配的大门。模式匹配的思想是为语言提供一个便捷的语法,根据特定的条件从对象中提取出组成部分。这正是instanceof操作符的用例,因为条件就是类型检查,提取操作需要调用适当的方法,或访问特定的字段。
换句话说,该预览功能仅仅是个开始,以后该功能肯定能够减少更多的代码冗余,从而降低bug发生的可能性。
四、Record
另一个预览功能就是record。与前面介绍的其他预览功能一样,这个预览功能也顺应了减少Java冗余代码的趋势,能帮助开发者写出更精准的代码。Record主要用于特定领域的类,它的位移功能就是存储数据,而没有任何自定义的行为。
我们开门见山,举一个最简单的领域类的例子:BankTransaction,它表示一次交易,包含三个字段:日期,金额,以及描述。定义类的时候需要考虑多个方面:
构造器getter方法toString()hashCode()和equals()
这些部分的代码通常由IDE自动生成,而且会占用很大篇幅。下面是生成的完整的BankTransaction类:
public class BankTransaction { private final LocalDate date; private final double amount; private final String description; public BankTransaction(final LocalDate date, final double amount, final String description) { this.date = date; this.amount = amount; this.description = description; } public LocalDate date() { return date; } public double amount() { return amount; } public String description() { return description; } @Override public String toString() { return "BankTransaction{" + "date=" + date + ", amount=" + amount + ", description=\u0026#39;" + description + \u0026#39;\\\u0026#39;\u0026#39; + \u0026#39;}\u0026#39;; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BankTransaction that = (BankTransaction) o; return Double.compare(that.amount, amount) == 0 \u0026amp;\u0026amp; date.equals(that.date) \u0026amp;\u0026amp; description.equals(that.description); } @Override public int hashCode() { return Objects.hash(date, amount, description); }}


推荐阅读