gpt4 book ai didi

java - 使用静态工厂方法获取更新了一个字段的新实例是否正确?

转载 作者:行者123 更新时间:2023-11-29 07:25:48 25 4
gpt4 key购买 nike

我认为标题是 self 描述的,但我会举一个例子来详细说明我的问题。我有一个包含几个字段的 DTO 类(在我的示例中是一个 CarDataTransferObj 类)。在另一个类中(我们称它为类 A),我需要多次创建该对象的新实例,但只更新一个字段(在我的示例中为 length 字段) .给定的 DTO 在类 A 中必须是不可变的。由于 CarDataTransferObj 类中有“许多”字段,我考虑了以下方法(以避免在 A 类中重复代码):

@Builder
public class CarDataTransferObj {

private Integer id;
private String color;
private String manufacturer;
private String model;
private String uniqueIdNr;
private Integer nrOfDoors;
private EngineType engineType;
private Integer length;
private Integer safetyLevel;

public static CarDataTransferObj newInstanceWithUpdatedLength(final CarDataTransferObj car, final Integer newLength) {
return CarDataTransferObj.builder()
.id(car.getId())
.color(car.getColor())
.manufacturer(car.getManufacturer())
.model(car.getModel())
.uniqueIdNr(car.getUniqueIdNr())
.nrOfDoors(car.getNrOfDoors())
.engineType(car.getEngineType())
.length(newLength)
.safetyLevel(car.getSafetyLevel())
.build();

}
}

对我来说,这有点像静态工厂方法的反模式用法。我不确定它是否可以接受,因此提出了这个问题。

以目前的方式使用静态工厂方法是一种反模式,应该避免吗?

最佳答案

在我的搜索中,我没有发现任何人将此1 称为反模式。

但是,很明显,如果您尝试使用未专门为支持此操作模式而实现的经典构建器来执行此操作……它不会起作用。例如,example CarBuilderImpl 中关于 Builder 设计模式的维基百科文章将状态放入一个急切创建的 Car 实例中。 build() 方法只是返回该对象。如果您尝试按照您建议的方式重用该构建器,您最终会修改已经构建的 Car

还有一个问题你需要担心。在我们修改维基百科 CarBuilder 示例以向正在构建的 Car 添加实际轮子(而不是多个轮子)时,我们不得不担心创建共享相同轮子的汽车轮子。

您可以在构建器实现中解决这些问题,但不清楚 yield 是否超过成本。


如果您随后将这种想法转移到使用工厂方法来执行此操作,您会得出稍微不同的结论。

  • 如果您将此作为“一次性”进行,那可能没问题。您有特定的需求,代码很笨拙……但问题也是如此。

  • 如果您需要对许多不同的参数或参数组合执行此操作,则无法扩展。

  • 如果创建的对象是可变的,那么这种方法在多线程环境中可能会出现问题,具体取决于您如何控制对用作模板的对象的访问。


1 - 对于是否是反模式,没有明确的可衡量标准。这是一个见仁见智的问题。不可否认,对于许多反模式,该观点将得到广泛认同。

关于java - 使用静态工厂方法获取更新了一个字段的新实例是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244753/

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