将值设置为Java15记录中的一个属性

6ovsh4lw  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(353)

我在代码中使用Java15预览特性记录,并将记录定义如下

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的值不会被传递,但是它会作为route参数传递。现在我想在控制器级别设置值,比如

model.setid(id) // Old style

如何设置记录特定属性的值

yqyhoc1h

yqyhoc1h1#

如果需要对属性进行变异,则需要使用 class 而不是 record .
来自jep:
用记录增强java编程语言,记录是充当不可变数据的透明载体的类。记录可以看作是名义元组。
因此,如果需要这种行为,最好使用类。

vuv7lop3

vuv7lop32#

您不能修改它们。从oracle页面:
记录类是一个简单的不可变的、透明的载体,用于一组固定的值,称为记录组件。java语言为声明记录类提供了简洁的语法,其中记录组件在记录头中声明。记录头中声明的记录组件列表构成记录描述符。
从java语言规范第8.10节可以看到以下内容:
记录声明是隐式的最终声明。允许记录类的声明冗余地指定最终

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

vc9ivgsu

vc9ivgsu3#

你不能。记录属性是不可变的。但是,您可以添加一个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());
    }
}

相关问题