2年前 (2022-01-04)  Java系列 |   抢沙发  879 
文章评分 0 次,平均分 0.0

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字段。最后,记录自动接收equalshashCodetoString方法的实现。它们使用组件名称和值来实现相等,并在打印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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册