当前位置: 首页 > 后端技术 > Java

Java8+10=Java18

时间:2023-04-01 17:38:57 Java

明天Java18将正式发布,虽然它不是长期支持(LTS)版本,但它确实实现了九个JEP(列在Java18中)。有哪些特点值得关注?今天胖哥就提前为大家解读一下。让我们一起观看、点赞、转发和再次关注。JEP400将UTF-8指定为标准JavaAPI的默认字符集。通过此更改,依赖默认字符集的API将在所有实现、操作系统、区域设置和配置中保持一致。JEP408Java终于有了一个内置的本地Web服务器。但是请注意,它没有可用的CGI或类似Servlet的功能。该工具可用于原型制作、临时编码和测试目的,尤其是在教育环境中。它不是Jetty和ApacheTomcat等产品的竞争对手,也不能也不建议在生产环境中使用。它只是提供了一个命令行工具来帮助开发人员进行设计、测试和教学。JEP413支持在JavaAPI文档中使用代码片段。以前在Java代码的注释中写一些sample很麻烦,甚至需要进行字符转义。Java注解现在引入了一个新的标签@snippet来解决在注解中包含代码片段示例的问题。它可以内联使用:/***下面的代码展示了如何使用{@codeOptional.isPresent}:*{@snippet:*if(v.isPresent()){*System.out.println("v:"+v.get());*}*}*/也可以引用外部代码片段:/***以下代码展示了如何使用{@codeOptional.isPresent}:*{@snippetfile="ShowOptional.java"region="example"}*/ShowOptional.java是它引用的源代码:publicclassShowOptional{voidshow(Optionalv){//@startregion="example"if(v.isPresent()){System.out.println("v:"+v.get());}//@end}}JEP417引入了一个API来表达向量计算,可以在运行时可靠地编译到支持的CPU架构上的最佳向量指令,从而实现比等效标量计算更好的性能。目前处于第三孵化阶段。JEP418为主机名和地址解析定义了服务提供者接口(SPI),以便java.net.InetAddress可以使用平台内置解析器以外的解析器。这提供了对Internet上某些协议的访问,您还可以对现有解决方案进行一些改进和定制。JEP419ForeignFunction&MemoryAPI(JEP419)是此版本中实现的更重要的JEP之一,因为它是ProjectPanama中包含的孵化组件之一。Panama正在简化将Java程序连接到非Java组件的过程。此特定功能在其第二次孵化迭代中引入了一个API,Java程序通过该API调用Native类库并处理Native数据。目的是取代设计非常糟糕的JavaNativeInterface(JNI)。大家都知道其他语言有一些很棒的类库,但是Java目前需要使用JNI来调用其他语言的类库。但是JNI设计的过于复杂,导致很多Java开发者难以上手。如果改变这种情况,用Java调用一些C或C++的音视频处理库和Python机器学习库就会非常容易。JEP420实现的唯一真正影响Java语言的JEP是开关模式匹配(JEP420),它在Java17中首次预览(这是第二次预览)。它的目的是“通过switch表达式和语句的模式匹配以及对模式语言的扩展来增强Java编程语言。在Java16中,JEP394扩展了instanceof运算符以采用类型模式并执行模式匹配://Oldcodeif(oinstanceofString){Strings=(String)o;...uses...}//Newcodeif(oinstanceofStrings){...uses...}我们不需要使用instanceof对对象进行类型转换允许使用其真实类型。Java14引入了switch表达式:intnumLetters=switch(day){caseMONDAY,FRIDAY,SUNDAY->6;星期二->7;案例星期四、星期六->8;星期三->9;默认->11;};如果这两者可以结合起来,switch可以进行模式匹配,下面这句话就会大大简化:staticStringformatter(Objecto){Stringformatted="unknown";if(oinstanceofIntegeri){formatted=String.format("int%d",i);}elseif(oinstanceofLongl){formatted=String.format("long%d",l);}elseif(oinstanceofDoubled){formatted=String.format("double%f",d);}elseif(oinstanceofStrings){formatted=String.format("String%s",s);}returnformatted;}JEP420的预览功能,将上面冗长的代码简化为:staticStringformatterPatternSwitch(Objecto){returnswitch(o){caseIntegeri->String.format("int%d",i);中科院eLongl->String.format("long%d",l);caseDoubled->String.format("double%f",d);caseStrings->String.format("String%s",s);默认->o.toString();};}是不是更清楚了?JEP421Object对象有一个finalize方法,用于在实例被垃圾收集器回收时触发操作。当GC(垃圾收集器)确定不再有对该对象的引用时,该对象的垃圾收集器将调用该方法。当时它是为了避免内存泄漏而设计的,现在有更好的替代方法try-with-resources和java.lang.ref.Cleaner在Java9中引入。因此,所有这些方法将被标记为过时的,并将在未来。总结很少有人在生产中使用JDK18,因为它不是LTS版本。更重要的是去年9月发布了JDK17LTS版本。许多库,尤其是Springframework6.0和SpringBoot3.0,将基于JDK17。你会坚持使用Java8多久?已经有10个版本的差异。下一个LTS是2023年9月的Java21。更多信息请关注公众号:Felordcn个人博客:https://felord.cn