{"id":1675,"date":"2013-12-02T00:14:50","date_gmt":"2013-12-02T03:14:50","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=1675"},"modified":"2013-12-02T00:14:50","modified_gmt":"2013-12-02T03:14:50","slug":"groovy-anotacoes-poderosas","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=1675","title":{"rendered":"Groovy: anota\u00e7\u00f5es poderosas!"},"content":{"rendered":"<p><a style=\"color: #ea9629; text-decoration: underline; outline: #000000;\" href=\"http:\/\/groovy.codehaus.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-235\" alt=\"groovylogo\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\" width=\"203\" height=\"100\" \/><\/a><\/p>\n<p>Groovy tem algumas anota\u00e7\u00f5es incr\u00edvelmente poderosas que vejo serem pouco faladas por aqui. O objetivo deste post \u00e9 apresent\u00e1-las: como ver\u00e3o elas realmente n\u00e3o quebram galhos, mas troncos de sequ\u00f3ias!<\/p>\n<h2>Logging simples<\/h2>\n<p>Estas anota\u00e7\u00f5es prov\u00e1velmente todos voc\u00eas j\u00e1 conhecem: s\u00e3o o suporte que a linguagem nos oferece para os mais variados frameworks de logging que a plataforma Java tem a nos oferecer.<\/p>\n<ul>\n<li>@Log &#8211; para o java.util.logging<\/li>\n<li>@Commons &#8211; para o Apache Commons Logging<\/li>\n<li>@Log4j &#8211; para o Log4j 1.x<\/li>\n<li>@Slf4j &#8211; para o SLF4J<\/li>\n<li>@Log4j2 &#8211; Para o Log4j 2.x (apenas a partir da vers\u00e3o 2.2 do Groovy)<\/li>\n<\/ul>\n<p>O funcionamento \u00e9 simples: anote sua classe com a anota\u00e7\u00e3o que representa o seu framework de logging favorito. Ser\u00e1 injetado um novo atributo na sua classe chamado log que corresponde ao objeto Logger do seu framework. Em seguida, basta us\u00e1-lo exatamente com o faria no Java. Eis um exemplo:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nimport groovy.util.logging.*\r\n\r\n@Log4j \/\/pro caso do Log4J\r\nclass Brutality {\r\ndef metodo() {\r\n\/\/ olha aqui o seu logger\r\nlog.info &quot;Logando!&quot;\r\n}\r\n}\r\n\r\n<\/pre>\n<p>O nome do logger por default equivale ao da classe. Quer customiz\u00e1-lo? F\u00e1cil: basta passar uma string como valor para a anota\u00e7\u00e3o. Exemplo: @Log4j(&#8220;logandoBruto&#8221;) para um logger chamado logandoBruto. Depois basta configurar o seu framework da maneira que preferir.<\/p>\n<h2>Objetos imut\u00e1veis? F\u00e1cil tamb\u00e9m.<\/h2>\n<p>A anota\u00e7\u00e3o @Immutable do Groovy \u00e9 aplicada sobre as classes cujos atributos n\u00e3o queremos que sejam alterados uma vez tendo sido definidos. Regra simples: sua classe deve ser do tipo final para que a regra se aplique. Como voc\u00ea faz? Simples: tal como no exemplo a seguir!<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nimport groovy.transform.*\r\n@Immutable\r\nfinal class PessoaImutavel {\r\nString nome\r\nString sobrenome\r\n}\r\n\r\n<\/pre>\n<p>Pronto: os setters gerados quando esta classe anotada s\u00e3o muito parecidos com o c\u00f3digo a seguir:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nvoid setNome(String valor) {\r\nif (this.nome == null) {this.nome = valor;}\r\n}\r\n\r\n<\/pre>\n<h2>Cacheando m\u00e9todos com @Memoized (Groovy 2.2)<\/h2>\n<p>Uma novidade bacana no Groovy 2.2: a anota\u00e7\u00e3o @Memoized. O que ela faz \u00e9 cachear o resultado da invoca\u00e7\u00e3o de uma fun\u00e7\u00e3o. Deve ser aplicada naqueles seus m\u00e9todos cujo resultado sempre \u00e9 o mesmo para um dado conjunto de argumentos, ou seja, as fun\u00e7\u00f5es que n\u00e3o dependem de efeitos colaterais.<\/p>\n<p>Use com cuidado este recurso: aplique-o somente em fun\u00e7\u00f5es que sempre retornam o mesmo valor para um dado conjunto de par\u00e2metros. Abaixo est\u00e1 um exemplo da sua aplica\u00e7\u00e3o:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nimport groovy.transform.*\r\n\r\nclass IntegratorTabajara {\r\n\r\n@Memoized\r\ndouble calculoBruto(double parametro) {\r\n\r\n\/\/ ap\u00f3s longo c\u00e1lculo retorna o valor\r\n}\r\n\r\n}\r\n\r\n<\/pre>\n<p>Ap\u00f3s a primeira invoca\u00e7\u00e3o, caso o par\u00e2metro seja o mesmo, ser\u00e1 retornado apenas o valor computado para aquele valor. Isto aumenta muito a performance do seu sistema quando bem aplicado (quando bem aplicado).<\/p>\n<h2>Representa\u00e7\u00e3o em forma de string de forma f\u00e1cil com @ToString<\/h2>\n<p>Pra finalizar uma anota\u00e7\u00e3o que vai te poupar muito tempo. Voc\u00ea sabe aqueles momentos em que fica escrevendo aquela fun\u00e7\u00e3o toString para retornar uma representa\u00e7\u00e3o dos seus objetos (especialmente em Grails quando queremos exp\u00f4-los de uma forma bacaninha nos combos)? H\u00e1 uma anota\u00e7\u00e3o que faz este trabalho pra voc\u00ea.<\/p>\n<p>De novo, \u00e9 simples: basta anotar sua classe com @ToString como no exemplo abaixo:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nimport groovy.transform.*\r\n@ToString\r\nclass Pessoa {\r\nString nome\r\nString sobrenome\r\n}\r\n\r\nprintln new Pessoa(nome:&quot;Henrique&quot;, sobrenome:&quot;Lobo&quot;)\r\n\/\/ saida formatada:\r\n\/\/ Pessoa(Henrique, Lobo)\r\n\r\n<\/pre>\n<p>Mais simples imposs\u00edvel: poupa muito tempo. :)<\/p>\n<h2>Concluindo<\/h2>\n<p>Notou que em diversos exemplos importo o pacote groovy.transform? Todas estas anota\u00e7\u00f5es s\u00e3o baseadas no recurso AST (Abstract Syntax Tree) Transformations do Groovy, que nos permite alterar o processo de compila\u00e7\u00e3o do c\u00f3digo. Um recurso muito interessante sobre o qual pretendo escrever em muito breve. ;)<\/p>\n<p>Ah, e poupe seu tempo com estas anota\u00e7\u00f5es ok?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Conhe\u00e7a algumas anota\u00e7\u00f5es do Groovy que ir\u00e3o lhe poupar um tempo monstruoso!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1675","post","type-post","status-publish","format-standard","hentry","category-groovy"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Groovy: anota\u00e7\u00f5es poderosas! - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=1675\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Groovy: anota\u00e7\u00f5es poderosas! - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Conhe\u00e7a algumas anota\u00e7\u00f5es do Groovy que ir\u00e3o lhe poupar um tempo monstruoso!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=1675\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2013-12-02T03:14:50+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2008\/12\/groovylogo.png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1675\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=1675\",\"name\":\"Groovy: anota\u00e7\u00f5es poderosas! - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1675#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1675#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\",\"datePublished\":\"2013-12-02T03:14:50+00:00\",\"dateModified\":\"2013-12-02T03:14:50+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1675#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=1675\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1675#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1675#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Groovy: anota\u00e7\u00f5es poderosas!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Groovy: anota\u00e7\u00f5es poderosas! - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=1675","og_locale":"pt_BR","og_type":"article","og_title":"Groovy: anota\u00e7\u00f5es poderosas! - \/dev\/Kico","og_description":"Conhe\u00e7a algumas anota\u00e7\u00f5es do Groovy que ir\u00e3o lhe poupar um tempo monstruoso!","og_url":"https:\/\/devkico.itexto.com.br\/?p=1675","og_site_name":"\/dev\/Kico","article_published_time":"2013-12-02T03:14:50+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2008\/12\/groovylogo.png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=1675","url":"https:\/\/devkico.itexto.com.br\/?p=1675","name":"Groovy: anota\u00e7\u00f5es poderosas! - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=1675#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=1675#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png","datePublished":"2013-12-02T03:14:50+00:00","dateModified":"2013-12-02T03:14:50+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=1675#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=1675"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=1675#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2008\/12\/groovylogo.png"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=1675#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Groovy: anota\u00e7\u00f5es poderosas!"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1675"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1675"}],"version-history":[{"count":4,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1675\/revisions"}],"predecessor-version":[{"id":1679,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1675\/revisions\/1679"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}