2006 年,Java 6 面世;2011 年,Java 7 发布。而后,Oracle 在三年一个版本的频率中推出了 Java 8 和 Java 9 ,并在 Java 9 发布之际宣布提速 Java 版本迭代,调整为每半年发布一个新版本。此举被许多开发者评价为这门一贯保守的编程语言的“自我放飞”,随之而来的除了对更多新特性的期待,也包括一些负面议论。
Java 9 发布半年后,首个采用新发版周期的 Java 10 于 2018 年 3 月 20 日(当地时间)正式发布。相比于主打“模块化”且广受好评的 Java 9 ,Java 10 主推的“局部变量类型推断”似乎从公布之初就不被特别看好,使用 var 也引起了不少争议。本期开源访谈,我们邀请到了资深 Java 开发者,Beetl、BeetlSQL 开源项目的作者李家智(@闲大赋),和我们分享他对 Java 的一些见解。
—— 嘉宾简介 ——
李家智,从事 Java 和 Java EE 开发已有 18 年,目前就职于东方金科,高级架构师。参与集团金融项目建设,参与公司技术研发和创新。在开源中国的昵称是@闲大赋,社区资深用户,在码云平台上托管了多个优秀的开源项目,包括国内流行模板语言 Beetl ,数据库 ORM 工具 BeetlSQL 等。最近为电子工业出版社写了一本《Spring Boot 2 精髓》,以及依据这本书完成的开发脚手架 SpringBoot-Plus 。其技术座右铭是:“没有用一个对象解决不了的难题,如果有,就用俩个对象”。
—— 访谈正文 ——
Java 9 实现模块化是否有对 Java 开发者带来实质性的影响?
Java9 以前通过 Package,Class 来组织 Java 代码,Java9 增加了 Modular 的方式组织代码。除了 Java 本身分为多个模块,开源工具也会按照这种方式组织开源产品。Java 模块会影响项目的开发方式和部署方式,我认为会给 Java 开发者带来影响。这是 Java 开发者必须掌握的技能。
另外,未来也许会出现关于类似 mvnrepository 关于模块的索引网站。
Java 10 的局部变量类型推断褒贬不一,使用 var 也引起了许多争议,对此如何评价?
我对此有保守的意见:
代码一次编写,多次阅读,var 一定程度会降低代码可阅读性。程序员需要一定时间培养阅读有 var 代码习惯 ,以前看到等号左右俩边都能清楚变量类型,现在还要往右边看。甚至还需要进入方法的定义才能看变量类型。
不过既然已经推出来,那就争取能使用,毕竟写代码就快多了。希望个以后有 IDE 插件把代码里的 var 在线显示成 Java 类型,或者相反。
除了类型推断之外,JDK 10 的哪些新特性您比较满意或认为是比较实用的?
有俩个我比较喜欢,一是 JEP 316 ,在可选内存设备上分配堆内存,可以使得 Java 能在大数据或者内存数据库方面有更出色的表现。另外就是实用 API 不断增多,比如输入流 copy 到输出流、反射、JMX 增强,这些对于很多开源框架都有用。
Oracle 提速 Java 迭代周期,六个月一次的版本发布频率让很多人抱怨跟不上,对此说说您的观点吧。
很多开源产品都是这个节奏,如果以开放、开源角度看待 Oracle JDK ,这是正常节奏。在这样的发布频率下,Java 的包容能力更强,会有更多的新理念、新框架、新的 API 引入进来,我觉得开发者更应该紧跟 Java 新功能,否则就落后特别多。
对我来说,不会抱怨跟不上,唯一的抱怨也许是公司产品因为历史原因还暂时用不上 Java 新版本特性,没有机会实践新特性。
Oracle 似乎有意在逐渐减少 OpenJDK 和 Oracle JDK 之间的技术差异,这对开发者使用选择上是否会有影响?
Oracle 是 OpenJDK 的领导者也是主要贡献者。就我个人经验来说,我一直在跟随厂商提供的中间件,也一直使用官方提供的 JDK ,并没有选择上的困难。我有朋友做性能监控产品,倒是经常研究 OpenJDK 源码。
Java 之前一直被认为设计思想太过保守,但近期模块化、快速迭代、减轻内部模块耦合(分离 JavaFX)等动作也被看作是 Oracle 思想上的转变。从个人角度,希望 Java 能有哪些方面的创新或跟进?这门“保守”的语言如果不再保守,您认为是好是坏?
我从事 Java 和 Java EE 开发有 18 年,一直得益于 Java 的保守。
稳定技术栈,向下兼容,开发人员能从 Java 的保守获得收益。别忘记 Python3 和 2 的不兼容造成的问题,还有一些流行开源不兼容造成的问题。比如 Spring Boo 2 ,就有不少特性不兼容 Spring Boot 1 。
现在创新在井喷,审美也在不断变化,Java 必然需要跟进这些创新,比如 JSON 和 YAML 应该进入标准类库。我想着如果当年 Java 迭代也这么快,也许现在的 JDK Logging 就不那么鸡肋了,因此我认为 Java 不再保守,是一件非常好的事情。
最后,和我们分享一下您的个人项目的 Java 版本跟进计划及后续方向。
Beetl 内部也有个类型推测功能,在运行模板渲染后,会尝试对模板里的变量进行类型推测,从而优化模板渲染,未来打算进一步优化一下引擎,利用已经实现的类型推测来进来提高运行性能。另外,如果采用 Java9 模块化,Beetl 体积会更小。分离出核心引擎模块,和 Web 模块,以及扩展模块。使用者会按照自己需求使用不同模块。
BeetlSQL 现在使用用户也非常多,它简单易学,通过内置 API 和 Query 类支持少写 SQL 的理念,同时通过 Mapper 类和对应的 Markdown 文件来管理复杂 SQL 。未来打算增强 ORM 功能,这一块相对于 Hibernate ,还是有很大差距。