1

当面对使用大量参数的构造函数时,我已经阅读了“Effective Java”中的建议使用构建器模式。

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

4

3 回答 3

1

不完全是,因为Builder所做的是构建一个对象。

那么,将某些方法(谁知道是什么)更改为 a 有什么意义Builder呢?

例如,您应该对包含太多参数的方法执行以下操作:

  • 将其分解为更小的方法,
  • 采用varargs
  • 使用 someCollection放入相同类型的参数
于 2013-11-05T16:08:30.550 回答
1

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

现在您可以创建一个构建器,然后创建该类型的不可变版本 - 或者您可以只允许“超级参数”类型是可变的并将其直接传入。在后一种情况下,您没有这样的构建器模式,但您可以其视为构建方法调用本身,因为您可以分别指定方法调用的每个方面。您可能会争辩说,构建器模式实际上只是这种模式的一个特例,在某些方面 - 碰巧该build()方法通常在构建器上,而不是将构建器作为其他地方的方法参数,但两者之间存在明确的相关性两者的工作方式。

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

但是,如果您确实发现自己有很多参数,那么值得再看一下设计,以检查您是否不应该将其中一些参数组合在一起,就像正常设计的一部分一样。

于 2013-11-05T16:11:16.193 回答
1

将方法转变为构建器是可能的,但不是典型的。Apache HashCodeBuilder就是一个示例,使用 like int hash = new HashCodeBuilder().append(a).append(b).build();,尽管在这种特定情况下,您可能更喜欢使用带有可变参数的方法,例如 Guava 的Objects.hashCode,使用 like int hash = Objects.hashCode(a, b);

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

于 2013-11-05T16:19:04.510 回答