2017-04-18 255 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