java - 在不使用具有长参数列表的构造函数的情况下构建大的、不可变的对象

标签 java oop scala immutability

我有一些大的(超过 3 个字段)对象可以而且应该是不可变的。每次遇到这种情况时,我都倾向于创建带有长参数列表的构造函数。

感觉不对,很难用,可读性也不好。

如果字段是某种集合类型,比如列表,那就更糟了。一个简单的 addSibling(S s) 会大大简化对象的创建,但会使对象变得可变。

你们在这种情况下使用什么?

我使用的是 Scala 和 Java,但我认为只要语言是面向对象的,问题就与语言无关。

我能想到的解决方案:

  1. “参数列表过长的构造函数”
  2. builder 模式

最佳答案

那么,您想要一个更易于阅读且创建后不可变的对象?

我认为流畅的界面正确完成会对您有所帮助。

看起来像这样(纯属虚构的例子):

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/

相关文章:

php - 抽象类-子类型

flash - 如何在Flash AS3中动态调用参数数量未知的方法?

scala - 为什么 Scala 将类型从 Char 强制转换为 Double?

scala - 元组从列表中消除重复

java - 如何获取在selenium中返回 boolean 值的属性值

java - 检查 Thymeleaf 模板中的 Null 属性

c++ - 每个派生类的静态变量

java - 为什么无法在 IntelliJ 中启动 Android 项目?

java - 如何将List的内容传递给另一个Android Activity

scala - 何时使用 Option#orNull