有没有升级 Java17 的?请教 record 的正确用法

2023-04-13 10:50:36 +08:00
 lyusantu

想使用 record 来替代原有的 VO DTO ,目前的实现属于有点为了用而用的感觉,求解有没有正确用法

目前是按业务定义了一个 record ,record 内定义了多个 record ,业务里直接引用 xxx.xxxRecord ,举例:

Record

public record UserRecord() {

    public record LoginRequest(
            @NotBlank(message = "请输入用户名")
            String username,
            @NotBlank(message = "请输入密码")
            String password, int age) {
    }

    public record LoginResponse(Long uid, String username, String token) {
    }

}

Service

public class UserService {
    public UserRecord.LoginResponse login(UserRecord.LoginRequest r) {
        var userinfo = userinfoMapper.selectById(1);
        return new UserRecord.LoginResponse(
        userinfo.getUid(),
        userinfo.getUsername(),
        StpUtil.getTokenValue());
    }
}
1975 次点击
所在节点    程序员
14 条回复
Oktfolio
2023-04-13 11:03:30 +08:00
非常鸡肋
xiaohu06
2023-04-13 11:18:38 +08:00
我理解 record 相比 class 核心就两点 1. immutable 2. 不需要写 get/set 等样板代码,类似于一种语法糖。至于在你代码里,取决于你想解决什么问题。
hun2008hun
2023-04-13 11:20:36 +08:00
还是 lombok 吧
Leviathann
2023-04-13 11:42:44 +08:00
没看到你的问题,什么叫有点为了用而用的感觉,代码里怎么体现的?
yazinnnn
2023-04-13 11:45:06 +08:00
1. 不能继承,只能实现
2. 无法定义 filed
3. 可以模式匹配配合 record 解构使用(目前 preview 中)
4. 可以把 record 当作具有主构造器 class 来实现 di, 大部分 di 框架都支持


粗看下来对比 lombok 只有模式匹配+record 解构+switch 增强表达式混用这一个优势
silypie
2023-04-13 11:46:42 +08:00
无法理解为什么添加这个特性...
ebony0319
2023-04-13 11:47:32 +08:00
试下
ebony0319
2023-04-13 11:48:25 +08:00
上条记录还没输入完就发送了
试下 Lombok

@Value
public class ColorValueObject {
int red;
int green;
int blue;

public String getHexString() {
return String.format("#%02X%02X%02X", red, green, blue);
}
}
suyabgaran
2023-04-13 13:22:03 +08:00
TWorldIsNButThis
2023-04-13 14:03:38 +08:00
@silypie 只有 record 才能做 pattern matching 并解构
这是代数数据类型的一部分
zzl22100048
2023-04-13 14:08:28 +08:00
record 是模式匹配和解构的基础,现在这个阶段看上去比较鸡肋
cheng6563
2023-04-13 14:11:34 +08:00
和旧的 Bean 不兼容,建议别用。
lsry
2023-04-13 14:18:23 +08:00
record 配合 sealed class 和 switch 做模式匹配解构还是不错的,但是缺失了类似下面这种语法:

record Data(int x, int y) {}
Data d = new Data{
x: 1,
y: 2
}

如果构造函数里面参数变多感觉就非常麻烦
sampdoria
2023-04-13 15:05:31 +08:00
感觉就是 scala 里的 case class

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/932175

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX