record
原以为record的出现是为了简化data class的写法。但实际用下来,发现并不能将jdk8时代的data class直接改成record。主要原因是:record是不可变的,它没有默认无参构造函数(可以手动重载)、也没有setter(语法层面不允许)。与record等价的class+lombok写法如下:
@Getter
//@NoArgsConstructor
@AllArgsConstructor
public class MyEntity {
private String category;
private String resourceName;
}
但,很多三方库其实是要用无参构造+setter来做data class的反序列化的,这会造成运行期问题。
另,record是会为我们自动生成equals、hashCode和toString方法的,用javap -v反编译class文件就能看到。因此,record=final class + AllArgsConstructor + 自动equals/hashCode/toString方法。
综上,record的用途并非用于data class的简化,而是类似于scala的case class,用于模式匹配。看下面的例子:
Object o1 = ...
String res = switch (o1) {
// 这种提取record成员的匹配被称为:解构模式。x和y都是模式变量。
case MyEntity(String x, String y) -> x;
default ->

最低0.47元/天 解锁文章
1999

被折叠的 条评论
为什么被折叠?



