{"id":62,"date":"2008-09-01T08:49:34","date_gmt":"2008-09-01T11:49:34","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=62"},"modified":"2008-09-02T09:57:58","modified_gmt":"2008-09-02T12:57:58","slug":"groovy-detalhes-que-encantam-aqueles-que-programam-em-java","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=62","title":{"rendered":"Groovy: detalhes que encantam aqueles que programam em Java"},"content":{"rendered":"<p>Confesso: estou viciado em Groovy. Desde que aprendi a linguagem a um ano e meio (ou dois?) anos atr\u00e1s, toda vez que vou programar em Java sinto falta de algum detalhe da sintaxe do Groovy na mesma. Aqui pretendo expor alguns detes pequenos detalhes que, embora n\u00e3o essenciais, s\u00e3o extremamente \u00fateis no dia a dia (e, acredite, voc\u00ea realmente sentiria falta dos mesmos ao trabalhar com Java). Estes detalhes tornariam Groovy um <em>Java++<\/em>?<\/p>\n<h2>Strings<\/h2>\n<h3>Interpola\u00e7\u00e3o de valores:<\/h3>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nint valorInteiro = 3;\r\n\/\/ No java pr\u00e9 5 \r\nString valor = &quot;O valor inteiro vale&quot; + Integer.toString(valorInteiro);\r\n\/\/ No java 5 e posterior (bem melhor!)\r\nString valor5 = &quot;O valor inteiro vale &quot; + valorInteiro\r\n<\/pre>\n<p><strong>Groovy<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nint valorInteiro = 3\r\n\/\/ Repare: sem concatena\u00e7\u00e3o de Strings!\r\nString valor = &quot;O valor inteiro vale ${valorInteiro}&quot;\r\n<\/pre>\n<h3>Strings com mais de uma linha<\/h3>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString multiLinha = &quot;Esta \u00e9 a minha string \\n&quot; +\r\n                         &quot;com mais de uma \\n&quot; +\r\n                         &quot;linha!&quot;\r\n<\/pre>\n<p><strong>Groovy<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nString multiLinha = &quot;&quot;&quot;Uma string com \u00e1spas triplas\r\n                             me permite escrever strings\r\n                             com quantas linhas eu\r\n                             quiser&quot;&quot;&quot;\r\n<\/pre>\n<h2>Evitando NullPointerException<\/h2>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n Object valor = construaObjeto();\r\n if (valor != null) { \/\/ bla bla bla }\r\n<\/pre>\n<p><strong>Groovy<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n def valor = construaObjeto()\r\n if (valor) {\/\/bla bla bla}\r\n<\/pre>\n<p>Em Groovy, a <i>verdade<\/i> nem sempre \u00e9 um booleano. Um valor nulo equivale a um false tradicional. <\/p>\n<p>Verificando valores nulos na concatena\u00e7\u00e3o de uma string<br \/>\n<strong>Java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n Object obj = criarObjeto();\r\n String str = &quot;O valor do objeto ser\u00e1 igual a &quot; + obj == null ? &quot;nulo&quot; : obj.toString();\r\n<\/pre>\n<p><strong>Groovy<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n Object obj = criarObjeto()\r\n String str = &quot;O valor do objeto ser\u00e1 igual a ${?obj.toString()}&quot;\r\n<\/pre>\n<h2>Criando getters e setters<\/h2>\n<p>Convenhamos: um dos recursos mais utilizados em nossas IDE\u00b4s consiste na op\u00e7\u00e3o de refatora\u00e7\u00e3o que encapsula atributos gerando getters e setters. Em Java, quando precisamos criar getters e setters, precisamos digit\u00e1-los explicitamente em nosso c\u00f3digo, tal como no exemplo abaixo:<br \/>\n<strong>Java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass ClasseQuente {\r\n   private int valor;\r\n   public int getValor() {return this.valor;}\r\n   public void setValor(int v) {this.valor = v;}\r\n\r\n  private String texto;\r\n  public String getTexto() {return this.texto;}\r\n  public void setTexto(String v) {this.texto = v;}\r\n}\r\n<\/pre>\n<p>Em groovy&#8230;<br \/>\n<strong>Groovy<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nclass ClasseQuentissima {\r\n     int valor\r\n     String texto\r\n}\r\n<\/pre>\n<p>Se coloco o acesso padr\u00e3o, n\u00e3o preciso criar gets e sets expl\u00edcitamente! Groovy os cria para n\u00f3s em tempo de execu\u00e7\u00e3o. Simples n\u00e3o?<\/p>\n<h3><b>return<\/b> opcional<\/h3>\n<p>Em Java, sempre que quero retornar um valor, preciso de usar a palavra-chave <b>return<\/b>. Em Groovy, o \u00faltimo comando de um bloco de c\u00f3digo corresponde ao valor retornado. Exemplo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n  int soma(int a, int b) {\r\n      a + b\r\n  }\r\n<\/pre>\n<h3>Closures<\/h2>\n<p>Closures encontram-se previstas para serem inclu\u00eddas no Java 7, mas antes de exp\u00f4-las, conv\u00e9m perguntar: que bicho \u00e9 este?<\/p>\n<p>Basicamente, closures s\u00e3o um tipo de dados que, na realidade, consiste em um bloco de c\u00f3digo execut\u00e1vel. Voc\u00ea pode ent\u00e3o ter vari\u00e1veis em seu c\u00f3digo que, na realidade, s\u00e3o c\u00f3digo execut\u00e1vel, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n  def closureQuente = {\r\n        print &quot;\\nSou uma closure. Ao ser chamada, imprimo isto!&quot;\r\n  }\r\n<\/pre>\n<p>Uma closure tamb\u00e9m pode ter par\u00e2metros, tal como em<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n   def closureQuenteComParametros = {a, b -&gt;\r\n         a + b}\r\n<\/pre>\n<p>E como eu poderia usar tais valores em Java? Em qualquer situa\u00e7\u00e3o na qual determinado m\u00e9todo de uma classe tenha de ser definido dinamicamente. Imagine, por exemplo, a utiliza\u00e7\u00e3o de closures em um enum. Abaixo exponho como imagino que as closures poderiam ser definidas em Java neste caso:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nenum OperacoesMatematicas {\r\n\r\n   Soma({a, b -&gt; return a+b;}),\r\n   Subtracao({a,b -&gt; return a-b;});\r\n\r\n   Closure operacao;\r\n   getOperacao() {return this.operacao;}\r\n\r\n   \r\n   OperacoesMatematicas(Closure o) {this.operacao = o;}\r\n}\r\n<\/pre>\n<p>Estes s\u00e3o apenas alguns dos detalhes que me encantaram em Groovy quando comecei a aprender a lingaugem. S\u00e3o suficientes para que eu troque de linguagem definitivamente? Claro que n\u00e3o! Java ainda apresenta uma performance muito superior e, querendo ou n\u00e3o, na JVM, \u00e9 a lingaugem padr\u00e3o. Isto sem mencionar que n\u00e3o existe um Groovy Community Process, tal como ocorre no caso do Java. <\/p>\n<p>E aqui fico ansioso para, no futuro, escrever algo neste blog como <i>Linguagem X (pode at\u00e9 ser Java): detalhes que encantam aqueles que programam em Groovy<\/i> :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Confesso: estou viciado em Groovy. Desde que aprendi a linguagem a um ano e meio (ou dois?) anos atr\u00e1s, toda vez que vou programar em Java sinto falta de algum detalhe da sintaxe do Groovy na mesma. Aqui pretendo expor alguns detes pequenos detalhes que, embora n\u00e3o essenciais, s\u00e3o extremamente \u00fateis no dia a dia [&hellip;]<\/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-62","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: detalhes que encantam aqueles que programam em Java - \/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=62\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Groovy: detalhes que encantam aqueles que programam em Java - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Confesso: estou viciado em Groovy. Desde que aprendi a linguagem a um ano e meio (ou dois?) anos atr\u00e1s, toda vez que vou programar em Java sinto falta de algum detalhe da sintaxe do Groovy na mesma. Aqui pretendo expor alguns detes pequenos detalhes que, embora n\u00e3o essenciais, s\u00e3o extremamente \u00fateis no dia a dia [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=62\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2008-09-01T11:49:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2008-09-02T12:57:58+00:00\" \/>\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=\"4 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=62\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=62\",\"name\":\"Groovy: detalhes que encantam aqueles que programam em Java - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"datePublished\":\"2008-09-01T11:49:34+00:00\",\"dateModified\":\"2008-09-02T12:57:58+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=62#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=62\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=62#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Groovy: detalhes que encantam aqueles que programam em Java\"}]},{\"@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: detalhes que encantam aqueles que programam em Java - \/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=62","og_locale":"pt_BR","og_type":"article","og_title":"Groovy: detalhes que encantam aqueles que programam em Java - \/dev\/Kico","og_description":"Confesso: estou viciado em Groovy. Desde que aprendi a linguagem a um ano e meio (ou dois?) anos atr\u00e1s, toda vez que vou programar em Java sinto falta de algum detalhe da sintaxe do Groovy na mesma. Aqui pretendo expor alguns detes pequenos detalhes que, embora n\u00e3o essenciais, s\u00e3o extremamente \u00fateis no dia a dia [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=62","og_site_name":"\/dev\/Kico","article_published_time":"2008-09-01T11:49:34+00:00","article_modified_time":"2008-09-02T12:57:58+00:00","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":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=62","url":"https:\/\/devkico.itexto.com.br\/?p=62","name":"Groovy: detalhes que encantam aqueles que programam em Java - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"datePublished":"2008-09-01T11:49:34+00:00","dateModified":"2008-09-02T12:57:58+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=62#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=62"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=62#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Groovy: detalhes que encantam aqueles que programam em Java"}]},{"@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\/62"}],"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=62"}],"version-history":[{"count":5,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/62\/revisions"}],"predecessor-version":[{"id":66,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/62\/revisions\/66"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}