Em Groovy:
// Definindo e inicializando um mapa em Groovy def errorMap = [ 1:"Database is down" ,2:"Network is down" ,3:"Something else" ]
Em Java:
//Mesmo mapa em Java Map errorMap = new HashMap(); errorMap.put(1, "Database is down"); errorMap.put(2, "Network is down"); errorMap.put(3, "Something else");Nos dois exemplos anteriores temos quatro linhas de código Java contra apenas uma do Groovy. Se o mapa for atribuído a uma variável estática, que aliás é muito comum no caso de mapas "constantes", a vantagem do Groovy fica ainda maior.
Em Groovy:
// Definindo e inicializando um mapa estático em Groovy def static errorMap = [ 1:"Database is down" ,2:"Network is down" ,3:"Something else" ]Em Java:
//Mesmo mapa estático em Java static Map errorMap = new HashMap(); static{ errorMap.put(1, "Database is down"); errorMap.put(2, "Network is down"); errorMap.put(3, "Something else"); }Resumindo, o Java não permite criar e inicializar um mapa ao mesmo tempo, o que acaba levando o programador a escrever muito código simplesmente para criar e preencher um mapa. Esta deficiência em particular poderia não existir se o método Map.put() retornasse a instância do próprio Map, como faz o método StringBuffer.append(), mas infelizmente o retorno do put() é void :(
Para melhorar esta triste realidade, podemos utilizar um MapBuilder, que usa o mesmo pattern do StringBuffer. O método put() do MapBuilder retorna a própria instância do builder, o que permite encadear chamadas ao put numa única linha de código. O HashMap é criado internamente e pode ser obtido através do método toMap().
public class MapBuilder{ private Map workMap; public MapBuilder(){ workMap = new HashMap(); } public MapBuilder put(Object key, Object value){ assert key != null; workMap.put(key, value); return this; } public toMap(){ return workMap; } }
A implementação acima é muito simples e pode ser melhorada, mas o objetivo é mostrar o conceito de um map builder. O trecho de código a seguir mostra um exemplo de uso:
static Map errorMap = new MapBuilder() .put(1, "Database is down") .put(2, "Network is down") .put(3, "Something else") .toMap();O MapBuilder é uma idéia simples que pode ajudar a reduzir volume e melhorar a legibilidade do código.