在面向对象和函数式编程中,不可变对象是 创建状态后无法修改其状态的对象。这是 与可变对象相反,可变对象可以在修改后 已创建。
下面的可变或不可变类?我认为这是可变的,因为静态字段singleton
在new MavenPush(project)
之后发生了变化,但是我需要100%正确的答案。这是古怪的代码,但就像Java代码一样
final class MavenPush {
private static volatile MavenPush singleton = null
private final def project
private MavenPush(project) {
this.project = project
}
static MavenPush with(project) {
if (singleton == null) {
synchronized (MavenPush.class) {
if (singleton == null) {
singleton = new MavenPush(project)
}
}
}
return singleton
}
}
答案 0 :(得分:2)
该类的实例是不可变的,随着该类的字段发生突变,该类是可变的。
答案 1 :(得分:1)
这个是一个不可变的实例;但也没有用-没有吸气剂(除非Groovy隐式地这样做-我不知道是否会发生这种情况)。
答案 2 :(得分:1)
如前所述, look 类的实例是不可变的(最终属性只能在c'tor中初始化)。但是由于您为project
保留了类型,所以这实际上取决于此。如果您通过String
,则您确实拥有不可变的东西(Java字符串是不可变的)-如果不是:这基本上是对可变的东西的不可变引用,并且您对此的所有期望都可能在某个时候破灭。
现在该静态成员为
从面向对象的角度看,单例似乎是错误的名称。 singleton pattern众所周知,但是您在这里拥有的是“最后一项更改的缓存”。
从FP视图中:with
通常用于要创建不可变数据的修改版本的上下文中。因此,如果您从先前获得的实例中运行with
,则不会从实例中“复制并更改”,而不会从“全局最后一项缓存(单例)”中“复制并更改”-这没问题简单的示例(只是一个属性),但可能带有“真实代码”。