我在“Effective Java”中读过一条建议,在面对使用大量参数的构造函数时使用Builder模式。
相同的模式是否适用于包含大量参数的方法?
答案 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,因此您可能会找到适当的构建器,或者您可能需要考虑减少工作量在该方法中完成,或将参数封装在其他复合类型中。