Groovy Beans x Java Beans

Hey! :)

Ultimamente estou encima do meu TCC mais do que nunca. Está ficando cada vez mais complicado, mais complexo, mais robusto… (ai, faltou adjetivos aí..) O pior de tudo é que realmente ainda tem muita coisa pra ser feita. o.O

Mesmo assim voltei a dar uma lidinha sobre a linguagem Groovy e achei interessante a forma com que ela trata os beans. Demorou, mas parece que todas as linguagens mais atuais notaram que fazer manualmente os getters e setters para toda variável de instância de uma classe não está com nada. Aleluia irmãos, mas existe o Eclipse pra que a gente possa gerar tudo automático. Era isso ou boa parte dos programadores Java estariam condenados a ter LER por conta do ocultamento de informação. Felizmente a linguagem Groovy reparou nesta falta de praticidade e trouxe características interessantes. Perfect! :D

GroovyBeans funcionam como os JavaBeans mas utilizando uma sintaxe mais simples (se piorasse, pra quê linguagem nova, né?!). Observe o exemplo abaixo em Groovy:

import java.util.Date

class Customer {

    Integer id
    String name
    Integer age

    static void main(args) 
    {
        def customer = new Customer(id:1, name:"Thania", age:21)
        println("Hello ${customer.name}")
    }
}

Saída:

Hello Thania

O código em Groovy acima é equivalente ao seguinte código Java:

import java.util.Date;

public class Customer {

    private Integer id;
    private String name;
    private Integer age;

    // Desce mais...

    public Integer getId() {
        return this.id;
    }

    // Mais um pouquinho...

    public String getName() {
        return this.name;
    }

    // Só mais algumas linhas...  

    public Integer getAge() {
        return this.age;
    }

    // Finalmente chegamos nos setters... 
    // Calma, a classe já tá acabando.

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    // Sim, rola o scroll só mais um pouquinho...

    public void setAge(Integer age) {
        this.age = age;
    }

    // Ufa! Achei que não ía achar esse main nunca... 

    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.setId(1);
        customer.setName("Thania");
        customer.setAge(21);

        System.out.println("Hello " + customer.getName());
    }
}

Gostei! ;)

4 comments:

  1. Andre Knabben, 7. Março 2008, 8:47

    Dúvida:

    como vc especifica que Integer id é readonly, devendo ser gerado apenas o set? - afinal, se não em java funciona de forma equivalente (tirando o lance do constructor automático), é só colocar public na frente :)

    Eu lembro que em .NET existem ‘properties’, que não parecidas, mas que vc pode especificar que é read-only e especificar que o get e/ou o set são feitos na verdade chamando um método específico. Bem interessante.

    Ou talvez a idéia do Eiffel, que é parecida com a do .NET (porém anterior, claro) mas com facilidades para alterar essa especificação em sub-classes.

    Please comment :)

  2. Thânia Clair, 11. Março 2008, 19:50

    Oi, André! Desculpa a demora em responder, mas essa vida de TCC tá complicada… :’(

    O site oficial da linguagem Groovy diz assim: “If you want a private or protected property you have to provide your own getter and setter which must be declared private or protected.”

    Pelo que entendi e li até agora sobre isto, se vc quer um atributo read-only, o negócio é acrescentar um final:

    // read only property
    final Integer id = 1
    

    … e, acredito eu, você ganharia apenas um get público. Também daria pra “sobrescrever” o set público default com protected fazendo assim:

    // read only property with public getter and protected setter
    Integer id
    protected void setId(Integer id) { this.id = id }
    

    Não me parece muito bonito e, na verdade, nem tinha pensado sobre isto antes de você comentar, mas acho que é isso.

    Vou dar uma pesquisada, talvez tenha uma forma melhor. No site oficial não achei nada além disso. Vou dar uma olhada no livro que eu estou lendo, depois te dou um toque. :)

  3. David Michael, 25. Março 2008, 17:50

    Olá Thânia, tudo bom? O Groovy te permite fazer isto também:

    private String nome;

    String getNome(){ return this.nome; }

    Desta forma o atributo seria get-only.

    Os getters e setters automáticos no Groovy só são criados quando o atributo não possui modificador de visibilidade, ou com modificador “default” se preferir.

  4. Thânia Clair, 7. Abril 2008, 16:06

    Há! Eu sabia que tinha uma maneira melhor e mais bonita!! :D

    Obrigada, David!! :)

Escreva um comentário: