首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用Java中的Lombok更新不可变对象?

用Java中的Lombok更新不可变对象?
EN

Stack Overflow用户
提问于 2021-12-09 12:32:45
回答 3查看 1.5K关注 0票数 3

我有一个带有Lombok @Value注解的域类@Value,因此将其标记为不可变,有3个字段。

在我的服务层中,我调用存储库来检查此人是否存在。

如果它确实存在,我需要从数据库中提取Person对象并更新money字段。

因为它是不可变的,所以不能这样做。我读了一些文章,发现这可以用构建器模式来完成。

我可能需要在我的updatePerson()类中创建一个Person,但不确定如何实现。还是我还需要做点别的?

Person.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value
@Builder
public class Person {

    private final UUID id;
    private final String job;
    private final BigDecimal money;
    
}

我正在使用Java 15。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-09 14:51:39

您还可以使用lombok的另一个特性,它不需要使用构建器。它被称为@With,使用此注释将创建不可变的setter,这意味着setter返回一个新对象,该对象具有旧对象的属性,但要更改的属性除外。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value
public class Person {
    /* You don't need to write final if you are using @Value. Lombok will make the variables final for you. 
    In theory you do not even need to write private, 
    because Lombok makes variables private by default instead of package private.*/
    private UUID id;
    private String job;
    @With 
    private BigDecimal money;
}

Person newPerson = person.withMoney(new Big decimal("10"));

一般来说,我不确定使对象不可变是否真的是一个好主意。除了UUID之外,每个变量看起来都可能在未来发生变化。

票数 6
EN

Stack Overflow用户

发布于 2021-12-09 12:50:45

使用Lombok

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value
@Builder(toBuilder = true)
public class Person {

    private final UUID id;
    private final String job;
    private final BigDecimal money;
}

personObjectFromDatabase.toBuilder().setMoney(...).build()

在这种情况下,您可以使用Builder模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person {

    private final UUID id;
    private final String job;
    private final BigDecimal money;
    
    public static class PersonBuilder { 
            private UUID id;
            private String job;
            private BigDecimal money;

            public PersonBuilder(Person defaultPerson){ 
                this.id = defaultPerson.getId();
                this.job = defaultPerson.getJob();
                this.money = defaultPerson.getMoney();
            }
            public PersonBuilder withId(UUID id) {
                this.id = UUID;
                return this;
            }
            public PersonBuilder withJob(String job) {
                this.job = job;
                return this;
            }
            public PersonBuilder withMoney(BigDecimal money) {
                this.money = money;
                return this;
            }
            public Person build() {
                return new Person(id, job, money);
            }
     }
}

使用此生成器,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Person person = new Person.PersonBuilder(personObjectFromDatabase)
    .withMoney(...)
    .build();

您只需创建一个copyWith()方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person {
    ...
    public Person copyWith(BigDecimal money) {
        return new Person(this.id, this.job, money);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-12-09 13:06:34

类是不可变的;您永远不能更改该类实例的值。

相反,必须创建类的新实例。

不要编写构建器;您已经在使用Lombok,只需使用@Builder注释,Lombok就会为您创建一个构建器。

编辑:您正在使用构建器注释。您正在寻找的解决方案似乎如下:

必须创建类的新实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70296361

复制
相关文章
C#如何删除字符串中任何位置的空格?
你或许知道你能使用String.Trim()方法,去除字符串的头和尾的空格。不幸运的是,这个Trim方法不能去除字符串中间的C#空格。
高一峰
2020/09/22
11.8K0
C#如何删除字符串中任何位置的空格?
JavaScript 中获取光标位置
DOM中并没有直接获取光标位置的方法,那么我们只能间接来获取光标位置。DOM支持获取光标选中的范围,我们可以以此为切入点,来获取或定位光标的位置,当选取范围起始点和结束点一样时,就是光标插入的位置。
越陌度阡
2020/11/26
12.5K0
mysql 从json字符串中获取指定的key:
SELECT SUBSTR(detail,    LOCATE('"email"',detail)+LENGTH('"email":"'),    LOCATE('",', detail,LOCATE('"email"',detail))-(LOCATE('"email"',detail)+LENGTH('"email":"'))) AS email FROM tb_sync_moka2oa_full_detail where moka_id in ( 62923,    64242,    66971,    67197,    67198,    67304,    74124) and is_delete = 0 order by id desc limit 50  ; 虽然mysql 5.7之后支持 JSON_EXTRACT 了,我测试了下好像不行
凯哥Java
2022/12/16
7.4K0
Flutter 中获取地理位置[Flutter专题11]
如今,发现用户位置是移动应用程序非常常见且功能强大的用例。如果您曾经尝试过在 Android 中实现位置,您就会知道样例代码会变得多么复杂和混乱。
徐建国
2021/11/30
3.3K0
Flutter 中获取地理位置[Flutter专题11]
后端 | Java 利用substring()和indexOf()从字符串中获取指定的字符
代码: @Test void spiltStrDemo() { /* * str.substring(4, 9); -->在str中截取从下标4开始(包含),到下标9之间的字符(不包含9) * str.indexOf("/"); -->返回str中“/”第一次出现时的下标 * str.indexOf("/", 5); -->返回跳过str的前6个字符后,“/”第一次出现的下标。可以利用这个方法跳过前几个相同的字符
倾盖
2022/08/16
3.2K0
后端 | Java 利用substring()和indexOf()从字符串中获取指定的字符
Flutter中的获取设备信息以及获取地理位置
在使用之前,我们一定要好好阅读文档,关于Android以及iOS平台的相关配置,我在这里不做过多介绍,大家自己去看文档。
拉维
2019/09/10
12.3K0
【已解决】怎么获取字符串中相同字符串第N 个所在的位置
对于我们经常用的rangeOfString这个方法只能获取最近的一次出现的位置,而不能指定第几个出现的位置。
君赏
2018/09/07
2.5K0
替换字符串指定位置字符 php,php如何从指定位置替换字符串
在php中可以使用“substr_replace”函数实现从指定位置替换字符串,其语法是“substr_replace(string,replacement,start,length)”,参数start表示从指定位置开始替换。
全栈程序员站长
2022/08/31
3.6K0
替换字符串指定位置字符 php,php如何从指定位置替换字符串
C#中获取系统时间
static void Main(string[] args) { Console.WriteLine("获取日期加时间:"); string strDateandTime = DateTime.Now.ToString(); Console.WriteLine(strDateandTime); Console.WriteLine("获取日期:");
牛老师讲GIS
2018/10/23
4.2K0
C#中获取系统时间
C#学习---基础入门(四)C#中的字符与字符串
字符 char(单个字符) 用单引号 ,例如char a=‘a’;可以通过调用char类下的方法进行一些操作,具体通过help查看其相关方法
互联网CEO
2018/12/03
7940
C# 文本框 TextChanged 延时触发
public partial class DelayTextBox : TextBox { #region private globals private System.Timers.Timer DelayTimer; // used for the delay private bool TimerElapsed = false; // if true OnTextChanged is fired. private bool Key
跟着阿笨一起玩NET
2019/03/14
2K0
C#的WinForm窗体程序中如何设置TextBox为密码文本框
在C#的WinForm窗体程序开发过程中,TextBox是常用的文本框控件,默认的TextBox文本 框输入的内容是可见的,如果在Winform程序中要设置TextBox文本框为密码输入框应该如何设置呢?其实将TextBox文本框设置为密码输入 框,也非常的简单,只需要设置TextBox文本框属性中的PasswordChar属性值,PasswordChar属性值自定义,可以为*号,代表输 入字符显示星号,也可为其他自定义字符。
全栈程序员站长
2022/09/07
5.6K0
C#中字符,字符串的大小写转换
对字符串来说,"string".ToLower()和"string".ToUpper()可以基本满足需求,但是当需要将首字母大写的时候,这两个函数就有点不够用了.但还好,我们还有TextInfo类下的ToLittleCase方法.在使用TextInfo类时,必须指定区域性.要获得区域性,必须能够访问当前线程,从该线程中检索CurrentCulture属性.
望天
2018/08/02
2.3K0
从损坏的手机中获取数据
有时候,犯罪分子会故意损坏手机来破坏数据。比如粉碎、射击手机或是直接扔进水里,但取证专家仍然可以找到手机里的证据。
FB客服
2020/02/23
10.2K0
getBoundingClientRect方法获取元素在页面中的相对位置
获取元素位置可以用 offset 或 getBoundingClientRect,使用 offset 因为兼容性不好,比较麻烦,offset获取位置会形成“回溯”。而 getBoundingClientRect 方法则 兼容性较好,基本所有的浏览器都支持了,且使用起来更容易和简单。
用户6167509
2019/09/04
3.9K0
什么?RecyclerView中获取点击位置的接口被废弃了?
《第三行代码》这才刚刚出版,竟然就有API被弃用了,我决定对这个问题好好研究一下,并加急写一篇文章进行分析。
用户1158055
2020/04/24
4.5K0
什么?RecyclerView中获取点击位置的接口被废弃了?
通过IP获取位置
昨天写了个获取天气的API,那么我也该写一个调用这个API的Demo了。不过获取天气必须要城市名称,而Demo上不可能在弄一个输入城市的吧……好在,可以通过IP获取所在城市。 <?php if(iss
FHYC
2018/06/22
1.8K0
[译]C#和.NET中的字符串
原文地址:Jon Skeet:Strings in C# and .NET System.String 类型(在C#语言中对应的别名是string)是.NET最重要的类型之一,不幸的是在它身上存在了太
潘成涛
2018/01/18
2.5K0
VBA代码库08:获取字符串中指定位置的子字符串
下面的自定义函数:ExtractString函数,来源于《VBA Developer’s Handbook》,对于分析字符串来说,是一个很有用的函数。
fanjy
2019/09/19
3.4K0
VBA代码库08:获取字符串中指定位置的子字符串
获取地理位置
可根据获取到的经纬度查询到所在的地理位置。 <p><button onclick="geoFindMe()">Show my location</button></p> <div id
ProsperLee
2018/10/24
2K0
获取地理位置

相似问题

火场动态链接与世博会

11

是否有一种方法可以显式分离隐式链接的DLL?

13

是否有一种方法可以检查Dropbox中的文件/文件夹是否有共享链接而不创建链接?

10

是否有一种方法可以撤消分离的头状态,而不取消我在分离头状态中所做的工作?

17

是否有一种方法可以强迫浏览器加载链接而不访问缓存?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文