具有Mutable字段的不可变对象

时间:2015-01-12 18:23:11

标签: java wrapper immutability

安装程序:我正在尝试编写一个值对象,所以我认为最好使它成为不可变的。此对象具有BigDecimal,因此:

public class MyValueObject {
    private final BigDecimal bob;

    public MyValueObject() {
        bob = new BigDecimal(0);
    }
}

我还编写了一些方法,包括一个返回新MyValueObject的add方法。以下是一个例子:

public MyValueObject add(BigDecimal augend) {
        return new MyValueObject(this.bob.add(augend);
}

问题是,这是否有效地设置了bob,还是按预期返回了全新MyValueObject全新BigDecimal

2 个答案:

答案 0 :(得分:2)

如果您使用“new”,则表示您正在创建一个新对象。所以它返回一个全新的MyValueObject,它使用“bob”,但不一样。

答案 1 :(得分:1)

我没有Java编辑器,所以请原谅这个例子。有时在这种情况下使用静态“构建器”并使构造函数变为私有是有用的。

public class ValueObject {
    private int bob;

    private ValueObject(int bob) {
        this.bob = bob;
    }

    public static ValueObject Create(int value){
        return new ValueObject(value);
    }

    public ValueObject Add(int increaseBy) {
        return ValueObject.Create(this.bob + increaseBy);
    }
}

我意识到我没有回答这个问题。您将创建一个新对象。我的回答是为了让代码中的“创建”更清晰,这将使您更清楚。