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
fonte
2014-04-16 09:47:21
"La prima classe è equivalente alla seconda classe con diverse funzioni di aiuto" - questo è un estremamente vaga descrizione delle notevoli differenze tra questi due concetti –