5

我在我的代码中使用 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

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

4

3 回答 3

13

你不能。记录属性是不可变的。但是,您可以做的是添加一个 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());
    }
} 
于 2020-12-11T15:38:00.077 回答
5

如果你需要改变一个属性,那么你需要使用 aclass而不是 a record

来自JEP

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

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

于 2020-12-11T15:14:43.830 回答
4

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

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

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

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

8.10.3 记录成员

对于出现在记录组件列表中的每个记录组件,记录类都有一个隐式声明的字段,该字段与记录组件同名,并且与记录组件的声明类型相同。该字段被声明为 private 和 final。该字段使用出现在相应记录组件上的注释(如果有)进行注释,并且其注释类型适用于字段声明上下文或类型上下文或两者。

于 2020-12-11T15:14:46.507 回答