
想使用 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 |