java21语法特性讨论

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 -> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值