GEP-14
摘要
记录类,或简称为记录,是一种特殊的类,用于对普通数据聚合进行建模。它们提供了比普通类更简洁的语法,仪式感更少。Groovy 已经拥有 AST 变换,如@Immutable
和@Canonical
,它们已经极大地减少了仪式,但记录是在 Java 中引入的,Groovy 中的记录类旨在与 Java 记录类保持一致。
动机
有关记录的一般概念的动机,请参阅下面的参考资料和有用链接部分。总的来说,对于普通数据聚合的特殊情况,可以编写非常简洁的类,例如
record Point3D(int x, int y, int z) { }
或
record Person(String firstName, String lastName) { }
这些类具有自动的toString
、hashCode
和equals
方法以及自动元组构造函数。所有这些都考虑了类的属性(称为记录组件)。
需求
主要要求是在适当的 JDK 版本(16+)上编译时提供与 Java 记录类等效的功能。通过等效功能,以下方面是相关的
-
支持在编写记录时减少仪式。
-
在字节码级别存储适当的信息,以便 Java 识别 Groovy 记录。我们将具有此类字节码信息的类称为原生记录。
-
尽可能地保持 Java 语法兼容性,包括简洁的构造函数语法。
非目标
-
在支持预览模式下的记录的 JDK 版本上提供原生记录支持
设计考量
-
许多 Groovy AST 变换已经提供了与 Java 记录的一些功能重叠的功能,例如
@ToString
通过提供声明式机制来实现自动toString
方法,从而有助于减少仪式。在有意义的情况下,Groovy 的记录实现应该利用这些现有功能。 -
尽管可以将现有的 Groovy AST 变换拼凑在一起以模拟记录功能,但它认为以简洁的方式提供这些片段的预先打包的包装来镜像记录功能是值得的。记录不应该为学习或使用 Groovy 的 Java 开发人员引入任何额外的阻碍。
-
Groovy 的现有 AST 变换提供了额外的自定义选项和额外的样板减少选项。这些应该与 Groovy 记录一起使用(在有意义的情况下)。
-
鉴于 Groovy 的现有 AST 变换适用于 JDK 16 之前的版本,Groovy 的记录功能可以允许创建类似记录的类。与原生记录不同,这些记录不会在字节码级别具有记录信息,但会遵循与原生记录相同的约定。此类类将使用注释存储记录信息。Groovy 编译器会识别它们,但 Java 编译器不会识别它们。
-
鉴于记录主要设计为数据聚合,Groovy 记录默认情况下为
@CompileStatic
。
Groovy 特殊功能
-
支持 Groovy 的命名参数语法
-
支持 Groovy 的
getAt
方法来对组件进行位置访问 -
支持 Groovy 的默认参数概念
-
支持其他语言中找到的额外辅助方法,例如 Kotlin 数据类和 Scala 案例类。候选方法包括
copyWith
、size
、toMap
、toList
。 -
支持记录的解构
初始实现
-
提供一个
@RecordType
注释收集器,它收集适合提供所需功能的现有 AST 变换。 -
提供一个
@RecordBase
AST 变换,它封装了现有变换中没有的任何特殊处理。 -
提供一个
@RecordOptions
注释,它允许自定义构建的记录实现。 -
提供对语法中的
record
关键字的支持,它可以用来代替@RecordType
注释。
参考资料和有用链接
参考实现
更新历史
1 (2021-10-26) 初始草稿 2 (2021-11-06) 更新以与 4.0.0-beta-2 保持一致