【发布时间】:2011-01-04 00:36:05
【问题描述】:
当为“不可变对象”创建类时,不可变意味着实例的状态不能改变;在构造函数中分配的所有字段)在 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。
【问题讨论】:
-
我会称其为名称不佳的方法。
-
"move" 和 "delta" 暗示现有实例属性的可变性...
-
请阅读实际问题——我没有问如何命名方法,而是问了如何称呼各种方法。但为了防止其他人在场边绊倒,我会稍微修改一下代码。
-
这让人想起写时复制语义......也许其中有一些东西。我知道这不是一个有用的答案,但也许它会击中某人大脑中的神经元并产生更好的答案:)
标签: java oop terminology immutability