本文不从语法和技术角度说明jdk1.8和18或其它高版本的差别,先问如下的问题请大家思考下。
1 在项目里为什么要用Java?如何选用版本?
用java为了通过做项目挣钱,客户方只管功能,不管实现,所以哪怕用了jdk18,客户绝对不会多付钱。如何选用版本其实是由项目经理定的,选用版本的出发点绝不是哪个新,而是哪个更稳定。
2 如果用了jdk1.8,而不用18或其他高版本,那么高版本带来的新功能没法用那怎么办?
其实在大多数项目里,jdk核心库里包含的语法,虽然有用,但不是全部,在代码里会包含logback和jpa等组件实现日志或数据库方面的功能,更会引入分布式组件实现高并发方面的功能。至于java核心库里的功能也会用到,比如用面向对象的语法实现类和方法,用集合对象存数据等。
那么如果是用1.8之类的低版本,高版本带来的便利没有那怎么办?第一开发业务时未必真会用到这些新特性,第二哪怕真遇到了,用低版本实现,无非就多几行代码,无非就代码难看些。
比如高版本里用的比较多的lambda或lombok或流式编程,低版本里绝对也可以实现。
3 如果项目一开始用的是低版本,然后再升级到高版本,需要做哪些事情?
技术上可能也就是改pom或gradle里的文件,但改好以后,一定的全面测试,因为谁也不知道升级jdk会有什么样的风险,毕竟这个是内核级别的修改。
我也说下我见到的升级版本后遇到的问题。
1 某支付项目原来是jdk1.8,某天项目经理想尝试下升级到11,注意还仅仅是11,不是18,升级好以后,发现老代码报如下的最典型的Unsupported major.minor version 52.0错。
java.lang.UnsupportedClassVersionError: common/TimerListener : Unsupported major.minor version 52.0 (unable to load class common.TimerListener)
如果要解决也行,无非也是调试并修改代码,但开发项目大家都知道,往往是在发布前还在修bug,谁有这个闲心干这个?后来就不了了之,回退到jdk1.8。
2 某支付模块通过dubbo调用风控模块的接口,而风控模块返回的对象比较复杂,不仅有自定义对象,而且自定义的对象里还嵌套对象。
两方面独自开发时,由于是mock数据,所以没事,但联调时出莫名其妙的问题,费了两三天才无意中发现一个模块是用jdk8,另一个是用jdk16,全改成jdk8以后,调试正常。
对此技术主管出了条限令,所有项目是用jdk8,绝不是jdk16,后来至少没遇到过类似问题。
3 某个项目上线新代码后,是用zabbix监控,上线后发现没过多久内存会飙升,反正后来一阵排查两版代码的差异,后来也是通过回退jdk解决了问题。
说了上述情况,绝不是说jdk高版本不稳定,而且虽然是通过回退jdk版本解决问题,但这只是表象,根本原因是否出在jdk 版本方面,谁也不知道,但谁也没时间去查。
开发项目更重要的是实现功能,且保证稳定,所以如果有程序员升级了jdk,而且用到了高版本的新功能,做好了没人表扬,顶多项目经理说句,某人比较关注新技术。但如果出了问题,哪怕最终根本原因可能不是因升级而导致,但只要是通过回退版本解决,那么绝对是这个程序员的责任。
可能现在用的较多的jdk版本不是8,而是11,但在项目稳定的前提下,没人敢轻易地升级jdk内核版本。况且衡量java程序员能力的,不是谁用的jdk版本高,而是谁能解决架构方面的问题,其中包括稳定性。所以当下很多项目不是用jdk最新版本,而是用较稳定的jdk版本,这也不足为奇了。
如果大家想进一步了解写简历和面试方面的技能,可以关注我。