2017-04-18 259 views
-5

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

+4

'immutable!= final' - 'immutable'意味着一个实例的值不能被改变,而'final'则意味着你不能创建子类。还有其他不可变但非最终的类,如'java.util.Date'等。 – Thomas

回答

2

永恒手段,那类不包含会改变它的内部状态的任何方法。

不可改变类的实例:

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); 
    } 
} 

可变类的实例:

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; 
    } 
} 

修饰符最终装置,该变量不能被改变。对于变量对象类型这意味着,该变量不能引用其他对象。对于原始类型(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 
+0

谢谢,现在我明白了。 –

+0

@ValueYouth如果有帮助,随时将此答案标记为“接受”:) – matoni

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是inmutable,让所有的改变对象的内容的操作将返回的BigDecimal过的新实例....

2

人数人数人数

final确实不是表示您不能通过修改通过该引用的对象。

当应用于引用时,final表示引用不能被改变来引用不同的对象。它是而不是相当于C++的const限定符。

不可变性意味着没有提供修改对象状态的方法。

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