不可变类的可选参数

时间:2012-11-07 08:06:39

标签: groovy

我不确定这是否是提出这个问题的正确论坛,但它是指代码,所以我在这里问。

在“Groovy in action”一节的第7.1.4节(命名参数)中,作者说使用命名参数“在创建具有一些可选参数的不可变类时经常出现”。

类的不变性与可选参数有什么关系?我认为这两个主题是完全正交的。

2 个答案:

答案 0 :(得分:2)

  

在创建具有一些可选参数

的不可变类时经常出现问题

上面的句子有点模糊,因为没有“类参数”,我只能假设它与方法/构造函数参数有关。

当我们谈论构造函数时,Groovy的命名参数在关于可选参数时是有意义的:

@groovy.transform.Immutable
class Person {

String firstName
String lastName
Integer age
}

def p = new Person(age: 42, lastName: 'Doe')

上面的示例演示了如何创建不可变Person实例。 firstName未作为命名参数提供,它是可选的。事实上,使用命名参数,可以在进行构造函数调用时指定任何参数组合,而无需实际为所有组合实现构造函数。

还可以在实例/静态方法调用as shown in this blog post by Mr. Haki中使用命名参数。

答案 1 :(得分:1)

该语句的关键是如果你正在处理一个不可变类,那么暗示你只有一次机会设置状态 - 在构造函数中。通常,您可以通过设置器一次一个地操纵(可变)对象来构建所需的状态。对于不可变的,您必须为每个可能的实例化状态集创建一个ctor,而不是像可选参数这样的设施不可用。对于包含许多字段的类,这可能会变得混乱。