当前位置: 首页 > 科技观察

爪哇:未来已来,您确定不想看到这些很酷的功能吗?

时间:2023-03-20 14:40:54 科技观察

在10月22日的OracleCodeone大会上,Java平台高级架构师MarkReinhold发表了《TheFutureofJavaisToday》的演讲。回顾最近几个Java版本的新特性,Java一年两次的发布周期,澄清了几个关于发布过程和Java版本的误解,花了大量篇幅介绍了几个未来的Java命令。有几个孵化项目值得人们期待,它们可以为Java带来更好的生产力、性能和可扩展性。整理了这四个项目相关的知识,大家可以提前了解下Java的这些酷炫特性。Java各版本发布时间和LTS版本MarkReinhold就不多介绍了。如果想了解Java的未来趋势,可以参考Java之父JamesGosling。他离开Oracle之后,想了解Java的动向可以看看MarkReinhold。ProjectAmber提供面向生产力的Java特性,例如字符串文字、switch表达式、模式匹配、记录等。该项目包含许多Java语言特性的新特性。包括:Currentlybeingimplemented:JEP302LambdaLeftovers:Reinforcementstolambdafunctions,suchasunderlinevariablesetc.BiFunctionbiss=(i,_)->String.valueOf(i);,lambda参数的Shadowing,消除了一些歧义,etc.WorkJEP305PatternMatching:这个功能很好,在Scala和kotlin中的模式匹配很强大,这个jep提供了类似的功能,有switch和record,可以大大简化条件分支的处理,比如:inteval(Noden){switch(n){caseIntNode(inti):returni;caseNegNode(Node):return-eval(n);caseAddNode(Nodeleft,Noderight):returneval(left)+eval(right);caseMulNode(Nodeleft,Noderight):returneval(left)*eval(right);default:thrownewIllegalStateException(n);};}数据类,一行定义,保存字段、字段访问方法、hash、equals、toString等方法,定义ValueObject简化:记录点(intx,inty);JEP325SwitchExpressions(预览版,JDK12):当前的switch、语句是什么。这个jep扩展了switch,可以用作表达式:intnumLetters=switch(day){caseMONDAY,FRIDAY,SUNDAY->6;caseTUESDAY->7;caseTHURSDAY,SATURDAY->8;caseWEDNESDAY->9;};JEP326RawStringLiterals(preview,JDK12):这个在很多语言中都有实现,可以更好的写字符串字面值,尤其是在处理正则表达式中很多转义字符的时候,类似于Go:Strings=`thisismyembeddedstring`;JEP草案8209434ConciseMethodBodies:普通方法定义用大括号括起来。这个特性提供了一种类似于简化Lambda表达式的形式,直接在一行中定义方法体,类似于C#和kotlin的特性:classMyListimplementsList{privateListaList;publicintsize()=aList::size;publicTget(intindex)=aList::get;...}Published:JEP286Local-VariableTypeInference(var)(JDK10):局部变量的类型推断,即使用var来定义变量。已经有同学用过了。很方便。它有点像动态类型语言。虽然不如Scala灵活,但已经很不错了。JEP323Local-VariableSyntaxforLambdaParameters(JDK11):增强的局部变量类型推断,用于Lambda表达式。搁置:JEP301增强型枚举。总之,每一个特性都可以大大简化我们的开发,让Java更像是一门“现代”的编程语言。ProjectLoom提供了一种称为fiber的轻量级用户态纤程,它简化了并发编程并且更加有效。很多年前就介绍过这个功能:https://colobu.com/2016/08/01/talk-about-quasar-again/,当时还是个玩具,开发起来很麻烦,还有是一些陷阱。作者后来负责这个jep,从java实现的角度可以很好的实现fiber,很期待。MarkReinhold首先用jshell来演示fiber的使用,一两行程序就可以搞定。我觉得方便程度堪比goroutine。然后他用一个restful的例子来比较Thread和Fiber的性能。restful服务收到请求后暂停100毫秒,模拟一个慢IO操作。结果显示,Thread有很多几百毫秒的尖峰,而Fiber在预热后一直在运行。稳定在100毫秒。这绝对是Java程序员应该注意的一个新特性。例子使用jetty作为服务器,让fiber在线程池执行命令的时候进行调度。该方法对现有代码改动不大。我比较关心的是如何实现它内部的调度算法。另外,一个业务完成时间复杂的fiber是否可以被scheduler自动调度,使得其他fiber可以使用有限的线程进行调度,类似于goroutine在系统调用时自动插入checkpoints巴拿马项目改进了JVM和外部(非java)代码和数据连接。当然,该项目不仅简化了JNI的开发,还提供了许多功能:从JVM(C、C++)调用本机函数,特别是根据JEP191从JVM或JVM堆内部访问本机数据JVM堆本机中的新数据布局JVM头文件的元数据定义API提取工具(见下文)本机库管理API面向本机的解释器和运行时“钩子”类和方法解析“钩子”面向本机的JIT优化工具或包装器插入,用于安全探索性工作-integratenativelibrariesMarkReinhold在他的演讲中举了两个例子。首先是为POSIX操作系统API的头文件unistd.h中的函数生成Java可访问代码。jextract工具会生成一堆函数和类型。关键是这些都是C头文件自动生成的,你不用费心去自己设计类型和方法。这比Go语言中的CGO方便多了,速度上堪比C#互通。所以以后如果想从Java访问C链接库,可以使用jextract一步生成,调用方法非常方便。又如调用C标准库time.h中的clock_gettime函数。它的参数需要是struct类型,访问类的生成方法同上:当然,这两个例子只是演示了本项目的一个功能,更多的功能大家可以继续关注。ProjectValhalla包含两个特性:值类型和原始类型泛型。值类型:提供对不可变类型和非引用类型的支持。不可变类型在Scala中非常常用,在Java中也会引入。使用这种类型有很多好处,一个是它可以显着提高性能,因为数据是不可变的,你不必担心同步更新。基本类型的泛型:为原始类型提供泛型支持,无需装箱和拆箱操作。MarkReinhold使用复数矩阵乘法的例子进行测试,测试工具使用JMH。首先是普通的publicclassComplex{...}类,然后改成值类型publicvalueclassComplex{...}再次测试,结果显示正常测试需要3.6秒分配3.7G内存;值类型只需要0.3每秒大约需要3.8M,效果惊人!这些功能仍在开发中。MarkReinhold已经能够用java12+这些项目运行一些示例,我们可以期待在不久的将来在Java中使用这些美妙的特性。