当面对使用大量参数的构造函数时,我已经阅读了“Effective Java”中的建议使用构建器模式。
相同的模式是否适用于具有大量参数的方法?
当面对使用大量参数的构造函数时,我已经阅读了“Effective Java”中的建议使用构建器模式。
相同的模式是否适用于具有大量参数的方法?
不完全是,因为Builder
所做的是构建一个对象。
那么,将某些方法(谁知道是什么)更改为 a 有什么意义Builder
呢?
例如,您应该对包含太多参数的方法执行以下操作:
varargs
Collection
放入相同类型的参数是的,有点。您基本上创建了一个新类型来封装所有参数 - 或者可能只是其中的一些。
现在您可以创建一个构建器,然后创建该类型的不可变版本 - 或者您可以只允许“超级参数”类型是可变的并将其直接传入。在后一种情况下,您没有这样的构建器模式,但您可以将其视为构建方法调用本身,因为您可以分别指定方法调用的每个方面。您可能会争辩说,构建器模式实际上只是这种模式的一个特例,在某些方面 - 碰巧该build()
方法通常在构建器上,而不是将构建器作为其他地方的方法参数,但两者之间存在明确的相关性两者的工作方式。
.NET 框架中的一个示例XmlWriterSettings
是传递给一堆方法或构造函数。(它有点用作构建器,通常在构建时使用XmlWriter
。)我现在想不出标准Java库中的任何示例,但它们可能存在于某处......
但是,如果您确实发现自己有很多参数,那么值得再看一下设计,以检查您是否不应该将其中一些参数组合在一起,就像正常设计的一部分一样。
将方法转变为构建器是可能的,但不是典型的。Apache HashCodeBuilder就是一个示例,使用 like int hash = new HashCodeBuilder().append(a).append(b).build();
,尽管在这种特定情况下,您可能更喜欢使用带有可变参数的方法,例如 Guava 的Objects.hashCode,使用 like int hash = Objects.hashCode(a, b);
。
采用大量不同类型参数的方法不适合可变参数,因此您可能会找到合适的构建器,或者您可能需要考虑减少在该方法中完成的工作量,或封装参数在其他一些复合类型中。