BigDecimal.java的关键字“final”

时间:2017-04-18 12:17:23

标签: java keyword final bigdecimal

众所周知,java中的不可变类应该由关键字“final”修改。但是,为什么类BigDecimal.java是一个异常?

4 个答案:

答案 0 :(得分:2)

  

为什么类BigDecimal.java是异常?

不是,final关键字意味着你只是无法改变bigdecimal的引用,你仍然可以改变对象的值...

final BigDecimal myDec = BigDecimal.valueOf(1L);
System.out.println(myDec);
myDec = myDec.plus(); //invalid, you cant change the ref

这里需要考虑的是 BigDecimal 是不可变的,所以改变对象内容的所有操作都将返回 BigDecimal 的新实例。 ..

答案 1 :(得分:2)

没有。没有。

final 意味着您无法通过该引用修改对象。

当应用于引用时,final表示无法更改引用以引用其他对象。 等同于C ++的const限定符。

Immutability 意味着没有提供修改对象状态的方法。

答案 2 :(得分:2)

不可变表示该类不包含任何会改变其内部状态的方法。

immutable 类的示例:

class ImmutableInteger {
    private final int value;

    public ImmutableInteger(int value) {this.value = value;}

    public int value() {return value;}

    public ImmutableInteger add(int a) {
        // instead of changing this state, we will create new instance with result
        return new ImmutableInteger(value + a);
    }
}

mutable 类的示例:

class MutableInteger {
    private int value;

    public MutableInteger(int value) {this.value = value;}

    public int value() {return value;}

    public MutableInteger add(int a) {
        value += a; // mutating internal state
        return this;
    }
}

修饰符 final 表示无法更改该变量。对于对象类型的变量,这意味着该变量不能引用其他对象。对于基本类型(byte,short,int,long,float,double)的变量,意味着该值无法更改。

BigDecimal a = new BigDecimal(1);
BigDecimal b = a.add(new BigDecimal(1)); // returns result in new instance (a is not changed = immutable)
a = new BigDecimal(5); // ok, 'a' is not final = can be change to refer to other BigDecimal instance)

final BigDecimal b = new BigDecimal(1);
BigDecimal c = b.add(new BigDecimal(2)); // // returns result in new instance (a is not changed = immutable)
b = new BigDecimal(5); // NOT OK!!!, 'b' is final = can not be changed to refer to other object

答案 3 :(得分:0)

这不是例外。 BigDecimal本身就是immutable,因为这个方法都没有修改对象值。 您可以更改变量引用。

BigDecimal bd = new Bigdecimal(10);
bd = bd.add(new BigDecimal(50)); // bd new equals 60


如果你宣布你的BigDecimal决赛,你将无法再改变参考。

final BigDecimal bd = new Bigdecimal(10);
final total = bd.add(new BigDecimal(50)); // Total new equals 60
// bd = bd.add(new BigDecimal(50)); // Will FAIL