作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一些大的(超过 3 个字段)对象可以而且应该是不可变的。每次遇到这种情况时,我都倾向于创建带有长参数列表的构造函数。
感觉不对,很难用,可读性也不好。
如果字段是某种集合类型,比如列表,那就更糟了。一个简单的 addSibling(S s)
会大大简化对象的创建,但会使对象变得可变。
你们在这种情况下使用什么?
我使用的是 Scala 和 Java,但我认为只要语言是面向对象的,问题就与语言无关。
我能想到的解决方案:
最佳答案
那么,您想要一个更易于阅读且创建后不可变的对象?
我认为流畅的界面正确完成会对您有所帮助。
看起来像这样(纯属虚构的例子):
final Foo immutable = FooFactory.create()
.whereRangeConstraintsAre(100,300)
.withColor(Color.BLUE)
.withArea(234)
.withInterspacing(12)
.build();
我用粗体写了“正确完成”,因为大多数 Java 程序员弄错了流畅的接口(interface),并用构建对象所需的方法污染了他们的对象,这当然是完全错误的。
诀窍在于只有 build() 方法实际上创建了一个 Foo(因此你的 Foo 可以是不可变的)。
FooFactory.create()、whereXXX(..) 和 withXXX(..) 都创建了“其他东西”。 p>
其他东西可能是 FooFactory,这是一种方法......
你的 FooFactory 应该是这样的:
// Notice the private FooFactory constructor
private FooFactory() {
}
public static FooFactory create() {
return new FooFactory();
}
public FooFactory withColor( final Color col ) {
this.color = color;
return this;
}
public Foo build() {
return new FooImpl( color, and, all, the, other, parameters, go, here );
}
关于java - 在不使用具有长参数列表的构造函数的情况下构建大的、不可变的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2848938/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!