gpt4 book ai didi

java - 与不可变对象(immutable对象)一起使用的类工厂 (java) 方法的调用方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:02 24 4
gpt4 key购买 nike

当为“不可变对象(immutable对象)”创建类时,不可变意味着实例的状态不能改变;在 Java(和类似语言)中在构造函数中分配的所有字段),有时仍然允许创建修改后的实例是有用的。也就是说,使用一个实例作为基础,并创建一个只有一个属性值不同的新实例;来自基本实例的其他值。举一个简单的例子,一个人可以有这样的类:

public class Circle {
final double x, y; // location
final double radius;

public Circle(double x, double y, double r) {
this.x = x;
this.y = y;
this.r = r;
}

// method for creating a new instance, moved in x-axis by specified amount
public Circle withOffset(double deltaX) {
return new Circle(x+deltaX, y, radius);
}
}

那么:应该调用什么方法“withOffset”? (注意:不是它的名字应该是什么——而是这类方法叫什么)。从技术上讲,它是一种工厂方法,但不知何故这对我来说似乎不太正确,因为工厂通常只被赋予基本属性(并且要么是静态方法,要么不是结果类型的成员而是工厂类型的成员)。

所以我猜应该有一个更好的术语来形容这种方法。既然这些方法可以用来实现“fluent interface”,也许它们可以是“流畅的工厂方法”?更好的建议?

编辑:正如其中一个答案所建议的那样,java.math.BigDecimal 是一个很好的例子,它具有“添加”、“减去”(等)方法。

另外:我注意到有 this question (由 Jon Skeet 撰写)有点相关(尽管它询问方法的具体名称)

编辑,2014 年 5 月:我目前最喜欢的是 mutant factory,FWIW。

最佳答案

我将这些类型的方法称为“复制方法”

虽然 clone() 方法创建了一个精确的副本,但复制方法创建了一个实例的副本,通常带有隐含或显式的变化。例如,String#toUpperCase() 将是不可变 String 类的复制方法 - 它复制一个具有变体的实例:它将所有字母大写。

我认为您示例中的 withOffset() 方法是类似的复制方法。

我不知道有任何引用文献记录术语“复制方法”。我借用了 C++ 中的术语“复制”:复制构造函数和 Taligent 编码标准 (more info) 中的“复制”命名指南。


至于术语“流畅的工厂方法”,我不知道为什么“流畅的”会有所不同,因为“流畅的接口(interface)”只是一种 API 样式(与构建器模式分开)。如果术语“工厂方法”在这里不适用,我看不出将其称为“流畅的工厂方法”如何使它更好地应用。

关于java - 与不可变对象(immutable对象)一起使用的类工厂 (java) 方法的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4589681/

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