Java平台的发展比以往任何时候都要快。让我们来探讨一下今年在Java 16和Java 17的Java创新方面为我们准备了什么。
“Java?这不是前一个时代发展缓慢的企业语言吗?”
虽然这是一种可以理解的情绪,但事实却截然不同。从2018年的Java10开始,Java开发工具包(JDK)每年发布两次,Java平台的发展比以往任何时候都要快。让我们来探索一下现在Java创新方面为我们准备了什么!
Java更新是什么样子的
对Java的更改通常可分为三个主要方面:
- Java编程语言
- Java核心库
- Java虚拟机(JVM)
几乎每个版本都在这些方面提供了改进。语言和库的更改通常对开发人员具有最高的可见性。但不要低估每一个JDK版本所带来的JVM改进的复合效应。这些可以包括更好的垃圾收集算法、性能改进和增强的安全性。所有这些JVM改进都只需升级即可使现有Java应用程序运行得更好,甚至不需要更改一行代码。
2021年3月,java 16发布了。9月推出Java17。所以,让我们看看我们已经拥有了什么,今年我们可以期待什么。
Java16有什么新功能
Java16附带了两个主要的语言更改:instanceof
的记录和模式匹配。对于许多Java代码库来说,记录尤其可以成为游戏规则的改变者。
通常,我们希望类只表示一些数据,例如,在为API定义数据传输对象时。记录提供了一种简洁的方法来定义表示不可变数据的类:
public record Course(String title, String author, int minutes) {
}
通过这个record记录声明,我们可以直接实例化和使用课程。默认情况下,将提供一个构造函数,该构造函数包含记录的每个组件(例如,本例中的标题、作者和会议记录)。组件还使用公共访问器方法获取相应的私有final
字段。最后,记录自动接收equals
、hashCode
和toString
方法的实现。它们使用组件名称和值来实现相等,并在打印record
时提供格式良好的输出。
以下是您如何使用上面定义的课程record:
var course = new Course("What's New in Java 16", "Sander Mak", 86);
var hours = course.minutes() / 60.0; // Accessor method
System.out.println(course); // Prints:
// Course[title=What's New in Java 16, author=Sander Mak, minutes=86]
不再需要自己编写构造函数、字段和访问器方法。只需声明record
的组件,编译器就会自动处理这一问题。
对记录有一些限制。例如,禁止向record
记录中添加非静态字段。记录不能扩展另一个类或record
,尽管record
可以实现接口。无论您是否明确声明,record
记录始终是最终的。所有这些限制都确保,无论何时,只要有两个record
的组件值完全相同,它们将始终被视为彼此相等:
var course1 = new Course("A course", "A. Uthor", 42);
var course2 = new Course("A course", "A. Uthor", 42);
course1 == course2; // false: we still have two distinct object instances
course1.equals(course2); // true: since all components are equal, the records are deemed equal as well
Java16带来的第二种语言更改称为“instanceof
的模式匹配”。传统上,您会检查对象,然后将其强制转换为其他类型:
Object o = "Actually a String";
if (o instanceof String) {
String s = (String) o;
return s.length();
}
值得注意的是,在instanceof
检查之后,我们需要引入一个String类型的变量,并将对象o
转换为String,然后才能使用它。从Java 16开始,您可以改用instanceof
右侧的类型模式:
if (o instanceof String s) {
return s.length();
}
类型模式定义了要执行的动态类型检查和绑定变量。当且仅当类型检查成功时,才将o
的值分配给s
。如果本例中存在else
分支,那么变量s将不在范围内,因为当我们在else
分支中时,类型检查已失败!
就其本身而言,instanceof
的模式匹配似乎只是一个简洁的小功能。但是,您可以期望类型模式出现在以后的Java版本中的其他地方(例如,在Java17的交换机中),并且除了类型模式之外,还会出现其他模式。因此,我们看到的是通过此功能可以实现的更大功能的预览。
Java16中最后一个值得注意的变化是引入了一个名为jpackage
的新Java打包工具。它允许您将Java应用程序打包到本机安装程序包中,用于任何主要平台:Windows、Mac和Linux。
Java 17带来了什么
由于Java是在开放的环境中开发的,许多针对Java17的Java增强方案(JEP)通过OpenJDK项目公开共享。除了交换机中的模式之外,我们还可以期望sealed classes密封类作为一种语言特性出现在Java17中。
在密封类sealed classes之前,任何类(除非声明为最终类)都可以任意扩展。这导致了一个开放世界的假设:您不能假设编译过程中遇到的子类是详尽的。在运行时,扩展基类的新类可以随时出现。使用密封类,可以将定义的类的继承限制为仅允许的子类:
public sealed class Vehicle permits Car, Boat, Plane
现在,除了在新的许可证关键字后提到的类别之外,没有其他类别可以扩展车辆类别。作为Vehicle
类的作者,您现在对继承层次结构有了更多的保证。接口也可以sealed密封。在后期,组合记录、模式和密封类可以帮助编译器检查开关构造中的穷尽性。然而,这一切都超越了Java17。
Java17是下一个被指定为长期支持(LTS)的版本。目前,Java11是最新的LTS版本。JDK供应商(如Oracle)在商业上提供长期支持。实际上,整个Java社区都围绕着这些LTS版本团结起来。您可以期望许多不同的JDK发行版将重点放在提供长期支持的JDK 11和JDK 17版本上。
如果有什么不同的话,这篇文章应该向您展示Java平台的发展速度。每年有两个版本,我们可以使用更高级的语言功能和改进的JVM性能。实际上,许多公司仍然在JDK 8上运行。随着Java 17即将发布的LTS,现在当然是提前计划并与时俱进的好时机!
原文地址:https://www.allhandsontech.com/programming/java/new-features-java-16-java-17/
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2537.html
暂无评论