讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 中的 Setters 和 Record

浅雪吖_2379

浅雪吖_2379

发布时间:2024-10-22 09:57:40

|

552人浏览过

|

来源于dev.to

转载

java 中的 setters 和 record

record 是一种结构体,其特点是不可变,即 record 类型的对象一旦创建,其属性就无法修改,即等价其他编程语言称之为数据类或dto(数据传输对象)。但是,如果需要使用 setter 方法修改某个属性,并且考虑到记录中的每个属性都是 final 类型,那么如何实现呢?

为了证明这是否可行,我们将创建一个记录 product,它具有名称和价格两个属性,以及在 java 中定义记录时自动创建的相应方法:

public record product(string name, double price) { }

现在,如果你创建一个 product 类型的对象并尝试修改 name 属性,你会发现这是不可能的,甚至没有 setter 方法来做到这一点:

product p = new product("bread", 1.0);
p.setname("water"); // error: cannot resolve method 'setname' in 'product'

但是,如果我们知道 record 可以有其他方法,那么我们可以创建一个 setname(string name) 方法来修改 name 属性并为其分配新值,因为答案是否定的. ,它不像普通课堂那样工作,例如:

public record product(string name, double price) {
    // error: cannot asign a value to final variable 'name'
    public void setname(string name) {
        this.name = name;
    }
}

那么如何在java中修改记录的属性呢?答案是,如果 set 方法返回 record 的新实例及其每个属性,并且显然带有修改后的属性,则可以。这个过程可能有点乏味,具体取决于记录具有的属性数量。

public record product(string name, double price) {

    public product setname(string name) {
        return new product(name, this.price);
    }

    public product setprice(double price) {
        return new product(this.name, price);
    }

}

这样,当调用任何一个setter方法时,都会获得一个具有修改属性的product类型的新实例,例如:

product p = new product("bread", 1.0);
product q = p.setname("milk");
product r = q.setprice(2.0);

对于每个对象 p、q 和 r,其 get、equals、hashcode 和 tostring 方法都可以正常调用,考虑到没有一个对象彼此相等,因为每个对象的属性值都不同。

public class Main {
    public static void main(String[] args) {
        Product p = new Product("Bread", 1.0);
        Product q = p.setName("Milk");
        Product r = q.setPrice(2.0);

        System.out.println(p); // Product[name=Bread, price=1.0]
        System.out.println(q); // Product[name=Milk, price=1.0]
        System.out.println(r); // Product[name=Milk, price=2.0]

        System.out.println(p.equals(q)); // false
        System.out.println(q.equals(r)); // false
        System.out.println(r.equals(p)); // false
    }
}

此时,考虑到记录被设计为一种允许以简单的方式存储和传输信息的结构,考虑这种方法是否适合要解决的问题非常重要。在应用程序中的方式并且是不可变的,或者如果需要具有更大灵活性的结构,那么应该使用 class 。有关何时使用记录的更多信息,您可以参考以下帖子。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

4939

2023.08.02

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

3794

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

3951

2025.07.04

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3036

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

286

2025.12.06

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

120

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

40

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

40

2026.09.16

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

40

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn