对包含许多参数的方法使用构建器模式?

时间:2013-11-05 16:04:27

标签: java builder effective-java

我在“Effective Java”中读过一条建议,在面对使用大量参数的构造函数时使用Builder模式。

相同的模式是否适用于包含大量参数的方法?

3 个答案:

答案 0 :(得分:1)

不完全是,因为Builder正在构建一个对象。

那么将某些方法更改为Builder的方法是什么意义?

对于包含太多参数的方法,您应该做什么,例如:

  • 将其分解为更小的方法,
  • 使用varargs
  • 使用一些Collection放入相同类型的参数

答案 1 :(得分:1)

是的,有点儿。您基本上创建了一个新类型来封装所有参数 - 或者只是其中一些参数。

现在你可以创建一个构建器,然后创建一个类型的不可变版本 - 或者你可以只允许“uber-parameter”类型是可变的并直接传递它。在后一种情况下您没有这样的构建器模式,但是您可以排序将其视为构建方法调用本身,因为您可以单独指定方法调用的每个方面。 您可以认为构建器模式实际上只是这种模式的一种特殊情况,在某些方面 - 碰巧build()方法通常在构建器上,而不是将构建器作为方法参数在别处,但是两者的运作方式之间存在明确的相关性。

.NET框架中的一个示例是XmlWriterSettings,它被传递给一堆方法或构造函数。 (它有点用作构建器,通常在构造XmlWriter时使用它。)我现在无法想到标准Java库中的任何示例,但它们可能存在于某个地方......

如果你确实发现自己有很多参数,那么值得再看一下设计,看看你是否应该将它们中的一些分组在一起,就像正常设计的一部分一样。

答案 2 :(得分:1)

将方法转换为构建器是可能的,但不典型。 Apache HashCodeBuilder是一个示例,与int hash = new HashCodeBuilder().append(a).append(b).build();类似,但在特定情况下,您可能更喜欢使用带有varargs的方法,例如Guava的Objects.hashCode,类似int hash = Objects.hashCode(a, b);。< / p>

采用大量不同类型的 参数的方法不适合varargs,因此您可能会找到适当的构建器,或者您可能需要考虑减少工作量在该方法中完成,或将参数封装在其他复合类型中。