Groovy 不可变类的可选参数

Groovy 不可变类的可选参数,groovy,Groovy,我不确定这是否是提出这个问题的合适论坛,但它涉及到代码,所以我在这里提问 在《Groovy在运行》一书的第7.1.4节(命名参数)中,作者说命名参数的使用“在创建具有一些可选参数的不可变类时频繁出现” 类的不变性与可选参数有什么关系?我认为这两个主题是完全正交的 在创建具有一些可选参数的不可变类时,会频繁出现错误 上面的句子有点模糊,因为没有“类参数”,我只能假设它与方法/构造函数参数有关 当我们谈论构造函数时,Groovy的命名参数在涉及可选参数时是有意义的: @groovy.transfor

我不确定这是否是提出这个问题的合适论坛,但它涉及到代码,所以我在这里提问

在《Groovy在运行》一书的第7.1.4节(命名参数)中,作者说命名参数的使用“在创建具有一些可选参数的不可变类时频繁出现”

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

在创建具有一些可选参数的不可变类时,会频繁出现错误

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

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

@groovy.transform.Immutable
class Person {

String firstName
String lastName
Integer age
}

def p = new Person(age: 42, lastName: 'Doe')
上面的示例显示了如何创建一个不可变的
Person
实例。
firstName
不是作为命名参数提供的,它是可选的。事实上,使用命名参数,在进行构造函数调用时可以指定任何参数组合,而不必为所有组合实现构造函数


还可以在实例/静态方法调用中使用命名参数。

该语句的关键在于,如果您处理的是不可变类,则意味着您只有一次机会在构造函数中设置状态。通常,您可以通过setter一次一个地操作(可变)对象,以建立所需的状态。对于不可变的,如果像可选参数这样的工具不可用,则必须为每个可能的实例化状态集创建一个ctor。对于一个有很多字段的类,这可能会变得很混乱。

谢谢,这一部分在书中也很清楚。但我的问题是关于类的不变性及其对命名参数的需要。布莱恩在下面回答了这个问题。