gpt4 book ai didi

java - 使用 @Builder(toBuilder = true) 而不是 setter 会产生开销吗?

转载 作者:行者123 更新时间:2023-11-30 01:52:44 24 4
gpt4 key购买 nike

我始终努力使我的代码完全不可变,并且根本不使用 setter。

当我需要更新对象、dto 或实体时,我使用 @Builder(toBuilder = true) 而不是 setter。

public Car updateCar(final String id) {
final Car existing = carRepository.getById(id);
final Car.CarBuilder builder = existing.toBuilder().make("Mercedes-Benz");
if (anyCondition) {
builder.status("READY");
}
final Car updatedCar = builder.build();
return carRepository.save(updatedCar);
}

我想问您,从性能角度来看,我不是为已经实例化的对象设置值,而是创建一个新对象,这真的很糟糕吗?

也许在上面的代码中,这并不重要,但我也可能需要更改集合中所有对象中的一个字段,因此空间复杂度将是线性的。

您更喜欢哪种方法:setter 或 toBuilder?

P.S.:上面的代码片段只是为了更好地理解我如何使用toBuilder

最佳答案

I would like to ask you is it really bad from a performance perspective that instead of setting a value into an already instantiated object, I create a new one?

您向我们和您自己提出了错误的问题。
对于如此简单的数据载体类,您不应该真正担心性能
基准(参见 JMH )并参见。

但从纯粹的理论角度来看,唯一的开销是创建另一个对象(内存中的大小取决于其成员的布局),以及从传输原始值/引用的附加步骤构建器实例到生成的实例(也许 GC 还要做更多工作?我什至不会考虑这一点)。
因此需要更多的 CPU 周期。

另请参阅Immutables ,看看有多少人和公司在使用它,然后问问自己,对于简单的用例,您是否真的应该考虑问这个问题。

<小时/>

参加这门类(class)

public class Car {
private String maker;
private int year;
private int kms;

// Getter - setters
}

大小约为 16 + 4 + 4 + 4 = 28 字节。
现在,使用诸如

之类的构建器
public class CarBuilder {
private String maker;
private int year;
private int kms;

public CarBuilder setMaker(final String maker) {
this.maker = maker;
return this;
}

public CarBuilder setYear(final int year) {
this.year = year;
return this;
}

public CarBuilder setKms(final int kms) {
this.kms = kms;
return this;
}

public Car createCar() {
return new Car(maker, year, kms);
}
}

大小仍然约为 16 + 4 + 4 + 4 = 28 字节。

这意味着使用构建器,仅类在堆中使用的字节数至少会加倍
然而,您需要考虑的是 Java 是基于引用的。这意味着所有创建的对象的指针将简单地复制到生成的Car实例。这些对象在内存中仍然是唯一的。

<小时/>

编辑后,也许您想要做的是对象池
在这种情况下,请考虑 Apache Commons Pool .

关于java - 使用 @Builder(toBuilder = true) 而不是 setter 会产生开销吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com