2014-04-16 22 views
5

Qual è la differenza tra immutabile e finale?Differenza tra immutabile e finale

Ad esempio, questo

@Immutable 
public MyClass { 
    String property1 
    MyOtherClass property2 
    List myLIst 
} 

e

public final MyClass { 
    final String property1 
    final MyOtherClass property2 
    final List myLIst 
} 

risposta

5

L'annotazione @Immutable indica al compilatore di eseguire una trasformazione AST che aggiunge i getter necessarie, costruttori, uguale, hashCode e altri metodi di supporto tipicamente scritti durante la creazione di classi immutabili con proprietà definite. [1]

Quindi, @Immutable genera una funzione di assistente, simili a "classi case" a Scala. La parola chiave final indica al compilatore che la variabile specifica è immutabile, poiché significa in Java.

La prima classe è equivalente alla seconda classe con diverse funzioni di supporto.

[1] http://groovy.codehaus.org/gapi/groovy/transform/Immutable.html

+1

"La prima classe è equivalente alla seconda classe con diverse funzioni di aiuto" - questo è un estremamente vaga descrizione delle notevoli differenze tra questi due concetti –

2

Il @Immutable annoatation causa il compilatore di trasformare una classe in modo che non può essere modificato dopo la costruzione. Il modificatore final - quando applicato a una variabile/campo - assicura che la variabile non possa essere riassegnata dopo la costruzione. Se applicato a una classe, final impedisce l'estensione della classe.

Quando una classe viene dichiarata immutabili, i tipi di tutte le proprietà devono essere immutabili, o il compilatore deve sapere come farli immutabile, che è fa per Date, Collection, Map, ecc Quindi nel tuo esempio sopra MyOtherClass deve anche essere immutabile.

per illustrare la differenza tra un campo finale e un campo immutabile

class FinalClass { 
    final List list 
} 

perché l è definitiva, non si possibile riassegnare dopo la costruzione in questo modo:

def fc = new FinalClass(list: []) 
fc.list = [] // throws a ReadOnlyPropertyException 

Ma si possibile muta questo campo, ad es

def fc = new FinalClass(list: []) 
fc.list << new Object() 

Al contrario, un campo di una classe immutabile non può né essere riassegnato né mutato. Per esempio, se FinalClass è annotata con @Immutable il seguente tentativo di mutare un campo causerebbe un'eccezione per essere gettato

def fc = new FinalClass(list: []) 
fc.list << new Object() // throws an UnsupportedOperationException 
Problemi correlati