Método X Closure: Isso o método não faz – Parte 2

Agora que já conhecemos o funcionamento básico das closures e vimos que elas podem ser entendidas como métodos, não porque são as mesmas coisas e sim pelo fato de as closures encapsularem também as características de um método.

Veremos neste post, em detalhes, qual a real diferença das closures com os métodos.

Devemos tomar muito cuidado ao utilizar as closures, diferente dos seus primos métodos, cada closure criada se transforma em um .class e ninguém quer deixar a memória da JVM de barriga cheia sem necessidade.

Voltando ao mundo de desenvolvimento ágil…
O simples fato de poder não declarar parâmetros quando só existe um já é um ponto positivo. “Em minha opinião, é claro!”.

As funcionalidades quadrado a seguir fazem a mesma coisa:

public int quadrado(int a){
    return a**2;
}

quadrado = { it**2 }

Como vimos no post anterior, a closure é um bloco de código encapsulado em um objeto e esta lógica pode até ser passada por parâmetro.

Um dos meus exemplos favoritos do groovy in action é a transformação de uma função em closure para poder ter sua lógica passada por parâmetro.

class MethodClosureSample{
    int limit
    MethodClosureSample(int limit){
        this.limit = limit
    }
    boolean validate(String value){
    return value.length() <= limit
    }
}

MethodClosureSample first = new MethodClosureSample(6)

// recurso ‘.&’ retornara não o valor mas a lógica contida no método
Closure firstClosure = first.&validate

def words = ['long string', 'medium', 'short', 'tiny']

println words.find(firstClosure) //Imprime:  medium

Definição:
MethodClosureSample: É uma classe que por definição recebe em seu construtor um numero que será utilizado para validar em um determinado método.

validate: É um método que recebe uma String e verifica se o tamanho da mesma é menor ou igual ao valor informado na criação do MethodClosureSample.

Instanciamos a MethodClosureSample.

Agora que vem a mágica. Utilizamos o “.&” para no lugar de executar o método e retornar o seu valor, nós retornamos a lógica atribuída a este método.

Criamos a closure firstClosure  que nada mais é que a lógica do validate da classe first.

Agora que temos a nossa closure que começaremos a diversão:

Começamos criando uma lista de palavras e em seguida chamando dessa lista a closure find (find – é uma closure que recebe outra que retorne boolean por parâmetro iterando na lista e retornando o 1º elemento true de acordo com a closure parâmetro).

println words.find(firstClosure) // que por sua vez retorna:  ‘medium’

Pronto: Aqui nós temos o find iterando a lista e verificando o resultado da atribuição do item iterado a closure parâmetro.

Por fim. Já sabemos o que é closure e conhecemos alguns de seus recursos que se encontram fora do escopo dos métodos tradicionais.

No próximo post veremos alguns testes de desempenho e seus resultados, sem falar em como melhorar o desempenho das closures em loops.

Post anterior: https://santograils.wordpress.com/2012/07/20/metodo-x-closure-entendendo-as-closures-no-groovy-parte-1/

Por: Jonatas Emidio

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: