Lucas Teixeira

@lucastex

Maravilhas do Groovy: A propriedade metaClass

com 12 comentários

Uma das facilidades que o groovy também traz, é a possibilidade de adicionar métodos em nossas classes em tempo de execução através da propriedade metaClass dos objetos.

Agora mesmo, eu precisava de um recurso para criar “slugs” (essas URLs amigáveis que o WordPress cria) de titulos de artigos. Tradicionalmente, o processo é criar aquelas classes **Utils.java com todos os métodos utilitários, mas com a metaprogramação, o mais usual passa a ser adicionar o métodos nas próprias classes que geram este comportamento.

No exemplo abaixo, eu adicionei o método slug() em runtime dentro da classe String e a partir de agora, qualquer objeto da classe java.lang.String possui o método slug(), com o comportamento descrito abaixo.

String.metaClass.slug { ->
    def s = delegate.toLowerCase()
    s = s.replaceAll(/[^a-z0-9\s-]/, "").replaceAll(/\s+/, " ").trim()
    if (s.length() > 45)
        s = s.substring(0, 45).trim()
    s.replaceAll(/\s/, "-")
 }

Em primeiro, definimos uma varíavel interna ’s’ com o valor da própria string que está sendo usada (através da propriedade delegate), após isso, aplicamos a primeira regex de caracteres especiais, outra para substituir os espaços em excesso e cortamos a string caso ela tenha mais que 45 caracteres. Por fim, substituímos os espaços por dashes.

Você pode rodar este script neste endereço, basta clicar em “Execute script”

Postado por Lucas Teixeira

October 25th, 2009 at 12:55 pm

12 Respostas a 'Maravilhas do Groovy: A propriedade metaClass'

Receber novos comentários por RSS or TrackBack to 'Maravilhas do Groovy: A propriedade metaClass'.

  1. Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx

    Lucas Teixeira

    25 Oct 09 at 12:57

  2. Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (via @lucastex)

    Paulo Suzart

    25 Oct 09 at 13:02

  3. RT: @lucastex: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx

    Erico Marineli

    25 Oct 09 at 13:20

  4. [...] This post was mentioned on Twitter by Lucas Teixeira and Paulo Suzart, Erico Marineli. Erico Marineli said: RT: @lucastex: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx [...]

  5. Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx

    lucastex

    25 Oct 09 at 12:57

  6. Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (via @lucastex)

    paulosuzart

    25 Oct 09 at 13:02

  7. RT: @lucastex: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx

    emarineli

    25 Oct 09 at 13:20

  8. Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)

    Lucas Teixeira

    26 Oct 09 at 14:19

  9. RT @lucastex: Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)

    Erico Marineli

    26 Oct 09 at 14:21

  10. Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)

    lucastex

    26 Oct 09 at 14:19

  11. RT @lucastex: Repostando: Toda string deveria ter um método slug() por default. Opa, pera aí: http://bit.ly/141iSx (Por favor RT)

    emarineli

    26 Oct 09 at 14:21

  12. [...] não é nada além de um conjunto de regexes encadeadas  com uma ajudinha do StringEscapeUtils (que saudade deste post) do [...]

Deixe um comentário

Get Adobe Flash playerPlugin by wpburn.com wordpress themes