想使用 record 来替代原有的 VO DTO ,目前的实现属于有点为了用而用的感觉,求解有没有正确用法
目前是按业务定义了一个 record ,record 内定义了多个 record ,业务里直接引用 xxx.xxxRecord ,举例:
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) {
}
}
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());
}
}
1
Oktfolio 2023-04-13 11:03:30 +08:00
非常鸡肋
|
2
xiaohu06 2023-04-13 11:18:38 +08:00
我理解 record 相比 class 核心就两点 1. immutable 2. 不需要写 get/set 等样板代码,类似于一种语法糖。至于在你代码里,取决于你想解决什么问题。
|
3
hun2008hun 2023-04-13 11:20:36 +08:00
还是 lombok 吧
|
4
Leviathann 2023-04-13 11:42:44 +08:00
没看到你的问题,什么叫有点为了用而用的感觉,代码里怎么体现的?
|
5
yazinnnn 2023-04-13 11:45:06 +08:00
1. 不能继承,只能实现
2. 无法定义 filed 3. 可以模式匹配配合 record 解构使用(目前 preview 中) 4. 可以把 record 当作具有主构造器 class 来实现 di, 大部分 di 框架都支持 粗看下来对比 lombok 只有模式匹配+record 解构+switch 增强表达式混用这一个优势 |
6
silypie 2023-04-13 11:46:42 +08:00
无法理解为什么添加这个特性...
|
7
ebony0319 2023-04-13 11:47:32 +08:00
试下
|
8
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); } } |
9
suyabgaran 2023-04-13 13:22:03 +08:00
OP 可以看看这个视频 https://www.bilibili.com/video/BV1tu411D7dR/
|
10
TWorldIsNButThis 2023-04-13 14:03:38 +08:00 via iPhone
@silypie 只有 record 才能做 pattern matching 并解构
这是代数数据类型的一部分 |
11
zzl22100048 2023-04-13 14:08:28 +08:00
record 是模式匹配和解构的基础,现在这个阶段看上去比较鸡肋
|
12
cheng6563 2023-04-13 14:11:34 +08:00
和旧的 Bean 不兼容,建议别用。
|
13
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 } 如果构造函数里面参数变多感觉就非常麻烦 |
14
sampdoria 2023-04-13 15:05:31 +08:00
感觉就是 scala 里的 case class
|