下面是可变或不可变类?

时间:2018-08-02 10:32:03

标签: oop groovy

  

在面向对象和函数式编程中,不可变对象是   创建状态后无法修改其状态的对象。这是   与可变对象相反,可变对象可以在修改后   已创建。

下面的可变或不可变类?我认为这是可变的,因为静态字段singletonnew 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
    }
}

3 个答案:

答案 0 :(得分:2)

该类的实例是不可变的,随着该类的字段发生突变,该类是可变的。

答案 1 :(得分:1)

这个一个不可变的实例;但也没有用-没有吸气剂(除非Groovy隐式地这样做-我不知道是否会发生这种情况)。

答案 2 :(得分:1)

如前所述, look 类的实例是不可变的(最终属性只能在c'tor中初始化)。但是由于您为project保留了类型,所以这实际上取决于此。如果您通过String,则您确实拥有不可变的东西(Java字符串是不可变的)-如果不是:这基本上是对可变的东西的不可变引用,并且您对此的所有期望都可能在某个时候破灭。

现在该静态成员为

从面向对象的角度看,单例似乎是错误的名称。 singleton pattern众所周知,但是您在这里拥有的是“最后一项更改的缓存”。

从FP视图中:with通常用于要创建不可变数据的修改版本的上下文中。因此,如果您从先前获得的实例中运行with,则不会从实例中“复制并更改”,而不会从“全局最后一项缓存(单例)”中“复制并更改”-这没问题简单的示例(只是一个属性),但可能带有“真实代码”。