3年前 (2021-10-01)  Java系列 |   抢沙发  4285 
文章评分 1 次,平均分 5.0

Java17 新特性概览

Java 17计划于9月14日发布,来自不同供应商的版本将于当天或之后发布。Java 17的特殊之处在于,Oracle和OpenJDK社区决定,这将是一个长期受支持的版本,与Java 11和Java 8之前的版本一样。

自从Java 10引入快速发布节奏以来,除Oracle外,许多供应商都在加紧生产具有不同支持级别的可生产二进制文件,包括Amazon、Azul、BellSoft、Microsoft、SAP和Eclipse Adoptium(以前是OpenJDK)。

以下是新功能:

macOS Upper AArch64支持

此版本中添加的一个突出功能是支持AARC64 Upper macOS,Apple New。。。去年发布的CPU系列(M1)支持。对于在这些平台上运行的人来说,这不是新闻,因为一些供应商已经发布了对JDK edition框架的支持,甚至可以追溯到Java8。尽管如此,官方批准的版本对于平台的未来维护和支持仍然非常重要。相比之下,Java9添加了一对Linux/AArch64平台支持,Java16添加了一对Windows/AArch64平台支持。

Sealing class

Sealed Classes密封类该特性已经完成了预览阶段,现在它是Java 17语言和平台的标准部分,如中定义的JEP 409。密封类允许开发人员显式声明类型的子类型,这可以防止其他人无意中扩展或实现它。

其他新功能

Java 17也适用于在AWT/Swing上运行的macOS,该应用程序带来了新的渲染管道(JEP 382),使用Apple Of Metal API代替OpenGL,以及生成随机数API和增强功能的新方法(JEP 356)。

其他受限制或不推荐的功能:

JDK内部元素是强封装的

JEP403强封装JDK的所有内部元素,但关键内部API除外,如sun.misc.Unsafe。无法再访问。。。通过单个命令行选项。将JDK从默认的松散强封装转换为默认的强封装。

保持Java9状态,如果用户试图使用反射或喜欢绕过其他内部API正常限制,则会发出运行时警告。还添加了命令行参数来控制此行为。保持Java 16,默认设置将从警告更改为通过抛出异常拒绝访问,但保留命令行参数以更改行为。

现在在Java17中,这些命令行参数被进一步删除,当然,这个限制也可以被禁用,这意味着对于这些内部API,所有未经授权的访问现在都被强封装。

好处:

  • 不断提高JDK的安全性和可维护性
  • 鼓励开发人员从使用内部元素转向使用标准API,以便他们和他们的用户可以轻松升级到未来的Java版本。

始终严格的浮点语义

恢复总是严格的浮点语义(JEP 306)。Java 1.2在中引入了Java对默认浮点语义的更改,本质上允许JVM性能以牺牲一点浮点精度为代价。对于需要应用严格语义的方法和类,引入了关键字strictfp。从那时起,在CPU中添加了一个新的指令集,这将产生严格的浮点语义,而不会产生过多的开销,因此,不再有默认和严格语义的动机。

Java17删除了以前的默认语义,现在严格执行所有浮点操作。关键字strictfp仍然存在,但它没有效果,并且会生成编译时警告。

删除实验AOT和JIT编译器

基于Java提前(AOT)和即时(JIT)编译器的删除实验。自从引入编译器以来,它几乎没有什么用处,维护它需要很多工作。

java9引入advance(AOT)编译为Graal编译器(一种使用Java编译的JIT编译器)的实验功能。java10使用添加的JVMCI接口使得Graal编译器可以作为OpenJDK介质的JIT编译器使用。

保持JEP 410在,AOT和JIT编译器已被删除。

删除RMI激活

RMI激活保留JEP 407在中被删除,保留Java 8在中成为可选,最后在Java 15中被弃用并标记为删除。RMI激活一种通过RMI方法激活分布式对象按需资源的方法,但它几乎是无用的,现在有更好的替代方法。RMI其余部分不受活动部分的影响。

删除Applet API

Applet api最终在jep398中被标记为删除,它在java9中被废弃。Applet API提供了一种在浏览器网页中嵌入Java AWT/Swing控件的方法,但今天,没有现代浏览器支持这种方法,因此在过去十年或更长的时间里,Applet API基本上与此无关。

丢弃安全管理器

毫无疑问,最大的放弃是Security Manager(JEP411)。安全管理器从Java 1.0开始一直存在,通常设计用于限制可在本地计算机上执行的Java操作,例如,限制对文件的访问、对网络的访问等,或者尝试通过禁用反射和某些API来沙箱不受信任的代码。

安全管理器的弃用始于Java 12,它添加了一个禁止使用它的命令行参数,从Java 18开始,此命令行参数将默认禁用在运行时设置安全管理器。Java 17中的更改意味着,当尝试从命令行或在运行时动态设置安全管理器时,JVM将生成运行时警告。

孵化器和预览功能

许多人想知道Java 17是否会有孵化器和预览功能,因为它已经升级到了长期支持的版本,而支持一个已经改变或很长时间没有取消的特性似乎是不明智的。但是现在我们看到了,Java17有两个孵化器模块和一个预览语言函数

Vector API

Vector API(JEP 414)正在进入第二个孵化器阶段。API使开发人员能够表示向量计算,然后JIT编译器可以编译它,以运行CPU的JVM和体系结构支持的适当向量指令(例如,利用SSE和AVX指令集)。

在此之前,开发人员要么必须依赖标量操作,要么必须使用/开发特定于平台的本机库。保持Java来实现向量API它还可以为当前架构中没有必要指令的事情提供优雅的回退,相反,您必须返回并以不同的方式进行计算。

虽然不是这个JEP的一部分,但是向量API的标准化也使得JDK类在可以使用它。比如Arrays.mismatch之类的东西,今天,在一些平台上有一个固有的矢量化实现,可以重写它,使其全部在Java Run-in中运行,因此不需要在JVM中编写和维护多个特定于平台的实现。

外部函数和内存API

另一个孵化器模块是外部函数和内存API(JEP 412),从技术上讲,它是Java 16合并和发展了先前的两个孵化器模块:外部链接器API(JEP 389)和外部内存访问API(JEP 393)。这两种组合允许使用Java编写静态类型代码来访问本机代码和内存,目的是能够。。。在这种情况下​​ JNI使用的第三代。

Switch模式匹配

Java 17中的最后一个语言预览功能用于切换模式匹配(JEP 406)。这种语言扩展了Switch表达式和语句,使它也可以。。。基于类型切换,类似于模式匹配instanceof(jep394)语法的引入,该语法是在java16中标准化的。

在此之前,如果要根据对象的动态类型执行不同的操作,则需要使用instanceof Check创建If-else-If链,例如:

String type(Object o) {
  if (o instanceof List) {
    return "A List of things.";
  }
  else if (o instanceof Map) {
    return "A Map! It has keys and values.";
  }
  else if (o instanceof String) {
    return "This is a string.";
  }
  else {
    return "This is something else.";
  }
}

结合使用switch表达式和switch新模式匹配,可以简化为:

String type(Object o) {
  return switch (o) {
    case List l -> "A List of things.";
    case Map m -> "A Map! It has keys and values.";
    case String s -> "This is a string.";
    default -> "This is something else.";
  };
}

原文地址:https://javamana.com/2021/09/20210914020026062u.html

  
 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2400.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册