groovy immutable annotation and map instantiation

I like very much object instantiation by map parameter. Anyway, it is very useful when you create complex object (for example from JSON or database).
Unfortunately, map object instantiation is not possible for classes which are @Immutable annotated and contains mutable objects.

Lets see it on the very simple groovy script (code bellow).
First create an MutableClass object with map as an constructor parameter. This class contains mutable field of type Sub.
Second try the same with ImmutableClass – it does not work.
What’s uncool : it is a RuntimeException … so be careful!

You can fix it by making Sub class also immutable – annotate it with @Immutable, too.


import groovy.transform.ToString
import groovy.transform.Immutable

@ToString
class MutableClass {
String field1
Sub field2
}

@Immutable
class ImmutableClass {
String field1
Sub field2
}

@ToString
// avoid RuntimeException by uncommenting line bellow
// @Immutable
class Sub {
String sub1
}

def map = ['field1': 'value1', 'field2': new Sub('sub1':'sub1value')]
def mutable = new MutableClass(map)
println mutable

assert mutable.field1 == 'value1'

def immutable = new ImmutableClass(map)

println immutable

Happy coding!

Informacje o @albgorski

Od 1999 roku profesjonalnie zajmuję się rozwijaniem oprogramowania. Głównie Java, ale także Groovy, PHP, HTML, JavaScript oraz Adobe Flex. Fascynują mnie metody wymiany danych, ich przechowywania oraz dostępowania. Jestem WIELKIM zwolennikiem Clean Code, TDD oraz agilistą (może lepiej lean-istą). Ekosystem Java dostarcza WIELE świetnych frawework-ów i bibliotek, a społeczność miłośników języka Java jest najlepsza pod słońcem :)
Ten wpis został opublikowany w kategorii groovy i oznaczony tagami , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Możliwość komentowania jest wyłączona.