V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lyusantu
V2EX  ›  程序员

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

  •  
  •   lyusantu · 2023-04-13 10:50:36 +08:00 · 1963 次点击
    这是一个创建于 372 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想使用 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());
        }
    }
    
    14 条回复    2023-04-13 15:05:31 +08:00
    Oktfolio
        1
    Oktfolio  
       2023-04-13 11:03:30 +08:00
    非常鸡肋
    xiaohu06
        2
    xiaohu06  
       2023-04-13 11:18:38 +08:00
    我理解 record 相比 class 核心就两点 1. immutable 2. 不需要写 get/set 等样板代码,类似于一种语法糖。至于在你代码里,取决于你想解决什么问题。
    hun2008hun
        3
    hun2008hun  
       2023-04-13 11:20:36 +08:00
    还是 lombok 吧
    Leviathann
        4
    Leviathann  
       2023-04-13 11:42:44 +08:00
    没看到你的问题,什么叫有点为了用而用的感觉,代码里怎么体现的?
    yazinnnn
        5
    yazinnnn  
       2023-04-13 11:45:06 +08:00
    1. 不能继承,只能实现
    2. 无法定义 filed
    3. 可以模式匹配配合 record 解构使用(目前 preview 中)
    4. 可以把 record 当作具有主构造器 class 来实现 di, 大部分 di 框架都支持


    粗看下来对比 lombok 只有模式匹配+record 解构+switch 增强表达式混用这一个优势
    silypie
        6
    silypie  
       2023-04-13 11:46:42 +08:00
    无法理解为什么添加这个特性...
    ebony0319
        7
    ebony0319  
       2023-04-13 11:47:32 +08:00
    试下
    ebony0319
        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);
    }
    }
    suyabgaran
        9
    suyabgaran  
       2023-04-13 13:22:03 +08:00
    TWorldIsNButThis
        10
    TWorldIsNButThis  
       2023-04-13 14:03:38 +08:00 via iPhone
    @silypie 只有 record 才能做 pattern matching 并解构
    这是代数数据类型的一部分
    zzl22100048
        11
    zzl22100048  
       2023-04-13 14:08:28 +08:00
    record 是模式匹配和解构的基础,现在这个阶段看上去比较鸡肋
    cheng6563
        12
    cheng6563  
       2023-04-13 14:11:34 +08:00
    和旧的 Bean 不兼容,建议别用。
    lsry
        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
    }

    如果构造函数里面参数变多感觉就非常麻烦
    sampdoria
        14
    sampdoria  
       2023-04-13 15:05:31 +08:00
    感觉就是 scala 里的 case class
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   931 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:29 · PVG 04:29 · LAX 13:29 · JFK 16:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.