JEP 是 JDK改进提案(JDK Enhancement Proposal) 的缩写,简单来说,这是一个关于增强 JDK 的建议。
JEP 可以是关于语言功能的,也可以是关于 API 的,例如 JEP 395 中关于 Record 的提案。Records 是一种语言特征,在反射 API 中进行了一些更改;或者关于 switch 表达式的新 switch 语法的 JEP 361 ,这是语言特性;它也可以是关于 JVM 是如何工作的,例如 JEP 333 是关于 ZGC 的;它可能是和安全更新相关的,和工具相关的,任何有关 Java 的东西。
JEP 是十年前创建的,它们有编号,第一个 JEP 是 JEP 1: JDK Enhancement-Proposal & Roadmap Process,创建于 2011 年 6 月 23 日,它给出了详细的 JEP 定义,JEP 的第一个目标是描述一个新事物,Java可能需要从社区获得评论和反馈,这个新元素在将来仍然会很遥远,JEP 可能需要大约三年来实现。JEP 1 的第二个目标是定义一个统一的格式来描述这些新事物,以及你可以找到这些 JEP 的地方。JEP 只适用于重大修改,小错误修复不会通过 JEP 发布。JEP 告诉我们几件事,一个 JEP 应该代表至少两周的开发,JEP 应该讨论一些需要广泛了解的东西,可以创建 JEP 来讨论远远没有准备好但值得研究的事情,这个目标就是:得到一些评论,一些反馈,一些关于这些的想法。因此,如果你想这么做,只需要使用 JEP,JEP 也可以撤回。
JEP 2: JEP Template,创建于 2011 年 6 月 23 日,该 JEP 提供了关于应该如何编写 JEP 的细节,最后一个是 2011 年 8 月 14 日发布的第三个 JEP,编号为 0,即JEP 0: JEP Index,JEP 0 实际上是所有 JEP 的目录,如果你在寻找一个特定的 JEP,看这个是最好的。
一个新的语言特征可以分散多个 JEP 之间,例如对于 Record 功能,分别有 JDK 14 的 JEP 359 第一次预览;还有 JDK 15 中的 JEP 384 的 Record 第二次预览;JDK 17 的 JEP 395 最终 Record 特性。最终,我们就有了 Record 的功能。
JEP 可以给你带来这几样东西,它的目标,它的非目标,它的动机,为什么有这个 JEP 以及它将带来的 JDK 的改进,最后一点,它应该描述这个 JEP 是关于什么的,以及它将对JDK中的其他地方产生什么影响。
所以,对于 Record 的 JEP,目标是设计一个面向对象的结构,表达一个简单的值聚合类型;第二,是帮助开发人员关注模块化的不可变数据,而不是可扩展行为;第三,自动实现数据驱动方法,如 equals()
和 accessors;第四,保持长久 Java 原则,例如名义类型(nominal typing) 和 迁移兼容性(migration compatibility)。我把这些方法称为样本代码(boilerplate),因为这就是你想要的,简单地说,Record 是值的集合(aggregation of values),保存不可变数据(hold immutable data),自动实现(automatically implement)。保持 Java 主体,每一种类型作为名字,所以简单地说,Record 只是一个命名的元组。
这里有三个非目标,第一个非目标是向样板代码(boilerplate)宣战;第二个非目标,解决使用 Java bean 命名约定的可变类问题;第三个非目标,添加注释驱动的代码生成。
Records 的动机在这里是为了更容易地创建仅仅作为数据载体的类。接下来是描述,在 JEP 395 中的 Title 下,你可以看到几页非常清晰的代码示例和模式解释,这是一个非常容易阅读和教育的文本。JEP 不是作为规范文档编写的,在规范文档中你可可能会想添加只对实现者有用的不易于阅读的规范文档,不适合需要 Record 作为日常工作工具的开发人员。最后,依赖部分,这里是对反射 API 的影响,在 Java 反射 API 的几个类中有更多的方法,以及 Record 如何与封闭类(sealed class)一起工作,因为 Record 是用 final class 建模的。
简单地说,JEP 是为了易于阅读,易于访问和学习教育而编写的文档,所以你可以阅读它们,这对你的 Java 有好处。