什么叫做与不可变对象一起使用的类工厂(java)方法

Sta*_*Man 5 java oop terminology immutability

为"不可变对象"创建类时,不可变意味着无法更改实例状态; 用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);
  }
}
Run Code Online (Sandbox Code Playgroud)

那么:应该调用什么方法"withOffset"?(注意:不应该是它的名字 - 但是这类方法叫做什么).从技术上讲,它是一种工厂方法,但对我来说似乎不太合适,因为工厂通常只给出基本属性(并且是静态方法,或者不是结果类型的成员,而是工厂类型).

所以我猜这些方法应该有一个更好的术语.既然这些方法可以用来实现" 流畅的界面 ",那么它们可能是"流利的工厂方法"吗?更好的建议?

编辑:正如其中一个答案所示,java.math.BigDecimal是一个很好的例子,它的'添加','减去'(等)方法.

另外:我注意到这个问题(Jon Skeet并没有减少)有点相关(虽然它询问方法的具体名称)

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

Ber*_*t F 3

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

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

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

我不知道有任何参考资料记录了术语“复制方法”。我借用了 C++ 中的“复制”一词:复制构造函数和 Taligent 编码标准中的“复制”命名指南(更多信息)。


至于术语“流畅的工厂方法”,我不知道为什么“流畅的”会产生影响,因为“流畅的接口”只是一种 API 样式(与构建器模式分开)。如果“工厂方法”这个术语在这里不适用,我不明白称其为“流畅的工厂方法”如何使它更好地适用。