【问题标题】:Set value to one of the property in Java 15 record将值设置为 Java 15 记录中的属性之一
【发布时间】:2021-03-23 00:24:33
【问题描述】:

我在我的代码中使用 Java 15 预览功能记录,并将记录定义如下

public record ProductViewModel
        (
                String id,
                String name,
                String description,
                float price
        ) {
}

在控制器级别我有以下代码

@Put(uri = "/{id}")
public Maybe<HttpResponse> Update(ProductViewModel model, String id) {
        LOG.info(String.format("Controller --> Updating the specified product"));
        return iProductManager.Update(id, model).flatMap(item -> {
            if(item == null)
                return Maybe.just(HttpResponse.notFound());
            else
                return Maybe.just(HttpResponse.accepted());
        });
    }

在模型的 UI 中,id 的值没有被传递,但是,它作为路由参数传递。现在我想在控制器级别设置值,比如

model.setid(id) // Old style

如何将值设置为记录特定属性

【问题讨论】:

    标签: java java-15 java-record


    【解决方案1】:

    你不能。记录属性是不可变的。但是,您可以添加一个 wither 来创建具有相同属性但新 id 的新记录:

    public record ProductViewModel(String id,
                                   String name, 
                                   String description,
                                   float price) {
    
        public ProductViewModel withId(String id) {
            return new ProductViewModel(id, name(), description(), price());
        }
    } 
    

    【讨论】:

      【解决方案2】:

      如果您需要改变一个属性,那么您需要使用class 而不是record。

      来自JEP:

      使用记录增强 Java 编程语言,记录是充当不可变数据的透明载体的类。记录可以被认为是名义元组。

      所以,如果你需要这种行为,你最好使用一个类。

      【讨论】:

      • 我还要补充一点,您明确地将您的类命名为“模型”,这通常意味着它是可变的。
      【解决方案3】:

      您不能修改它们。来自Oracle 页面:

      记录类是一个浅不可变的、透明的载体 一组固定值,称为记录组件。 Java 语言 为声明记录类提供了简洁的语法,其中 记录组件在记录头中声明。名单 记录头中声明的记录组件形成记录 描述符。

      从 Java 语言规范 Section 8.10 可以阅读以下内容:

      记录声明是隐含的最终声明。这是允许的 声明一个记录类以冗余指定final

      和

      8.10.3 记录成员

      记录类具有记录中出现的每个记录组件 组件列表一个隐式声明的字段,其名称与 记录组件和与记录的声明类型相同的类型 零件。 此字段被声明为私有和最终字段。该领域是 用出现在 对应的记录组件,其注解类型为 适用于字段声明上下文,或类型上下文,或 两者都有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 2021-10-19
        • 1970-01-01
        相关资源
        最近更新 更多