Generics: Usar ou Ignorar?

26 respostas
saoj

Alguem aqui está usando Generics e está gostando ???

Eu estou tão acostumados com os casts que eu não consigo pensar em usar isso.

Em alguns lugares parece ate legal usar, como numa interface Context.java que tem apenas um método:

public Object getContext();

Transformar o retorno de getContext num Generics parece bonitinho, mas realmente é algo que não desejo me preocupar.

Pelo que eu entendi, essa maluquice de Generics foi só para pegar ClassCastExcetpions no compile-time ao invés de no runtime.

Na boa, eu nunca fiz um cast errado e acho que errar um cast requer bastante desatenção. O cara tem que estar bebado para meter uma String numa collection e depois tentar fazer um cast para Integer quando pegar um elemento dessa mesma collection. :?

Acho que a única vez que eu me deparei com um ClassCastExcetpion foi quando eu estava fazendo refactoring do meu código. Perdi um minuto da minha vida que talvez eu teria economizado com Generics.

Vale a pena comecar a usar Generics ou não?

26 Respostas

louds

O problema é ter que usar a 1.5.
Tem lugar que ainda vai levar alguns meses até homologar a nova JVM.

Mas acho legal usar generics, o código costuma ficar mais claro para os outros. Ai vai do seu gosto também:

List /*String*/ list;
//ou
List<String> list;
//ou
List listOfStrings;
mister_m

Generics aumentam a legibilidade do código em algo bem específico e, por isso mesmo, são mais úteis quando você está fornecendo código para outras pessoas usarem ou no futuro, quando você mesmo precisar editar seu código.

Encare basicamente como uma das boas práticas que você usaria visando a manutenção, com a vantagem de que ainda emite erros de compilação.

_fs
public abstract class ViewComponent< T extends ViewComponent > {
    private T component;
    public T getComponent() {
        return component;
    }
}

Olha que coisa linda. Assim evito, até o momento, 2457 casts ou implementar este método em todas as classes filhas por nada. :smiley:

Isso sem contar o exemplo magnífico de DAO que o cv postou:

public class Base<T extends Base> {
 
   public static T find(int id) { ... }
   public static Collection<T> find_by_example(T example) { ... }
   public static Collection<T> find_by_...
 
   public T save() { ... }
 }
 
 
 public class Candidato extends Base<Candidato> {
   private String nome;
   public void setNome(String nome) { ... }
   public String getNome() { ... }
 }

uau! :smiley:

pcalcado

A medida que as pessoas se acostumam com objetos, Generics se tornam úteis. para programar com Command+Beans, não fedem nem cheiram, mas quando você tenta criar objetos de verdade… putz, não aguenta mais casts e ClassCastExceptions idiotas :stuck_out_tongue:

Luca

Olá

Par mim vc está 90% correto!

Quando comecei a tomar contato com o Java 5 (ainda 1.5 beta) achei que generics era pura perda de tempo e que haviam outras carências mais urgentes no Java. Me pareceu muita complicacão para pouco ganho. Achei que realmente era só para enfrentar a concorrência com C# e C++

Desde então já li um monte de coisas entre outras Core Java Technologies Tech Tips for March 15, 2005 e ainda não consegui mudar muito minha opinião. Ao contrário do mister_m, acho que o código com generics fica em geral um pouquinho mais dificil de ler (apesar de declarar o tipo certo já em tempo de compilação). Acho que pouca gente usa o novo loop que se beneficia do generics. E me enche o saco os warnings dos códigos legados.

Mas ao mesmo tempo, já que generics agora está na linguagem só me resta usa-los. Assim como o Phillipe, acredito que daqui há algum tempo a gente se acostume e não ache mais tão estranho ler código com estes sinais de menor e maior.

[]s
Luca

mister_m

Depende. O uso, como:

Collection<String> c = ...

fica mais claro. Já declarações enigmáticas como:

class X<T extends X><T>> ...

concordo :slight_smile:

PS: no código acima, o sinal de maior não deveria aparecer após o segundo X, mas o jforum parece não saber generics e ainda tenta me corrigir :mrgreen:

louds

Generics é simples o suficiente quando você é apenas um feliz usuario das classes “generalizadas”. Caso contrario, tem que reviver a época dos templates do c++.

Luca

Olá

Perfeito o exemplo do mister_m!

Estou postando de novo para reafirmar minha resposta a pergunta título do tópico que já respondi no final do meu post: não ignore, já que existem então use! As gerações futuras lhe agradecerão.

[]s
Luca

renatosilva
JavaFeature generics = new Gambiarra();

A propaganda do Java 5 era facilidade, mas aí o que eu só tenho visto é um monte de gambiarra que estão adicionando, como generics e anotações. Antigamente uma das diferenças entre as “linguagens” Delphi e Java que eu achava era que a Java era digamos, mais “coesa”, o Delphi Pascal me parecia meio cheio de remendos. Mas tô vendo o Java virar a mesma coisa.

Mesmo sendo gambiarra, o troço tem utilidade prática, pra mim, já que fui “apresentado” a Generics num fórum (não sei se este) onde estava procurando um meio de “selar” uma collection com apenas um tipo de item. Eu acho maravilhoso o primeiro exemplo do mister_m, apesar de gambiarra. Já o segundo ainda não aprendi e me parece complicado e mais gambiarra ainda, mesmo sendo bastante útil como o Lipe disse.

renatosilva
mister_m

Por que você considera anotações uma gambiarra?

renatosilva

EDITADO: Pelo mesmo motivo do Luca (não do Louds!). Não vou dizer que Generics destruiu o Java, mas vendo a coisa como um todo, isso soa meio como um remendo, aliás apenas um de muitos que acho que ainda virão. Aí vão falar: ih, o Java é muito confuso, complicado, e vão inventar uma coisa melhor. É só uma questão de visão pessoal.

mister_m

Ok, vamos tentar de novo: por que você considera anotações uma gambiarra? :slight_smile:

Operador_Nabla

Há uma característica das novas coleções, que utilizam Generics, em comparação com coleções legadas, onde o typecasting se faz necessário, que ainda não foi levantada aqui: uma vez que você cria um objeto como sendo uma coleção de um determinado tipo (por exemplo, List<String>), você só vai poder adicionar objetos daquele tipo à sua coleção (List<String> só aceita objetos String). Isto pode ou não ser desejável pelo programador (por exemplo, Generics dificultam (não tenho certeza disto) a implantação de listas encadeadas).

É uma pena que os Generics não suportem tipos primitivos.

Se você está se referindo ao loop do tipo “for each”, digo que, pela impressão que eu tenho, quem está acostumado a programar em shell script e/ou Python certamente vai se beneficiar deste novo loop. Na minha opinião, é mais seguro usar este loop para varreduras simples sobre uma coleção e deixar os iterators apenas para casos especiais (por exemplo, quando a coleção puder ser alterada durante o loop).

Eu só não gostei da sintaxe adotada (eu prefiro uma palavra reservada in aos dois pontos, mas reconheço que introduzir uma palavra reservada nova na linguagem poderia trazer muita dor de cabeça para o programador).

Enfim, sobre toda esta discussão sobre usar ou não Generics (e/ou os outros novos recursos da linguagem), eu penso o seguinte:

Imaginem que, daqui a algum tempo, a nossa língua portuguesa passe por uma reforma ortográfica (isso já foi feito uma vez, há algumas décadas: perguntem aos seus pais — ou avós). Certamente, no começo, muita gente iria reclamar, dizendo que tal reforma seria desnecessária. Mas, conforme esta nova ortografia seja ensinada nas escolas, as futuras gerações passarão a conviver com ela sem grandes problemas, passando despercebidamente pela transição da antiga ortografia para esta. E as gerações atuais terão a oportunidade de “correr atrás”, adaptando-se à nova ortografia.

Acho que o que está acontecendo com Java é algo parecido…

PS: Meu texto pode estar carente de detalhes. Fiquem à vontade para complementá-lo.

renatosilva

Se a gente começar a analisar, vamos ficar discutindo eternamente, porque é o que eu acho e não quero convencer as pessoas a não gostarem disso. Você aceitou com naturalidade, mas eu não. Aliás, anotações são piores que generics pra mim. Pra você ter uma idéia eu não sou chegado nem no javadoc!!!

Mas voltando à questão inicial. Usar generics com o tempo será uma coisa natural, as pessoas se acostumarão. Quanto à obrigação do Java 5, pelo o que a citação do artigo que coloquei diz, me parece que o código compilado é compatível com a JVM 1.4, não? O problema fica só na imcompatibilidade do código, mas creio que não seja tão difícil assim criar uma ferramenta que converte os generics para typecasts caso haja necessidade de retroceder o código de 1.5 para 1.4. Entendem?

_fs

renato, você usou Java 5 já?

E sobre o novo for, se não me engano ele é só uma sintaxe mais simples para uma declaração for com iterator.

Luca

Olá

Só para marcar minhas posíções:

  1. Generics não é uma gambiarra. Como falei, houve uma pressão para incluir generics de modo que o Java não ficasse em inferioridade com o C#. Mas sei também que um dos integrante dos comites do Java sempre insistiu em incluir generics desde muito antes do C# sonhar em existir. Tem vantagens inegáveis mas tem o impacto negativo dos warnings dos códigos legados. É capaz de aindai surgir algum plugin do Eclipse ajudando a refatorar neste sentido.

  2. Anotações também não são gambiarras. A gente reclama quando a programação sai de dentro do código e vai para trocentos arquivos xml desconectados do código. Daí o sucesso do XDoclet. Acho que foi este tipo de pressão que motivou a inclusão das anotações. Acho que os futuros frameworks vão nos obrigar a conhecer anotações (que não são tantas assim), então vamos nos preparando desde já.

[]s
Luca

renatosilva

???

Bom sobre o novo for eu gostei, só faltou o “in” mesmo!

cv1

“in” nao foi colocado pq introduzir uma palavra-chave nova na linguagem a essa altura do campeonato ia quebrar uma quantidade absurda de codigo (quantas variaveis chamadas “in” existem por aih?)

Luca

Olá

Exatamente! Não foi do foreach que falei e sim deste for ( Integer j : list) do exemplo abaixo igual ao que nós vimos no tutorial do Guilherme no SouJava.

Algo assim:

import java.util.ArrayList;
   
     public class Autoboxing {
       public static void main(String[] args) {
           ArrayList<Integer> list = new ArrayList<Integer>();
           for(int i = 0; i < 10; i++){
              list.add(i);
           }
           int sum = 0;
          for ( Integer j : list){
            sum += j;
          }
         System.out.printf("The sum is %d.", sum );
       }
     }

[]s
Luca

renatosilva

Pois é, “in” de “input”, “entrada”… No Delphi tem uma parada que algumas palavras só são reservadas em certo contexto, como index dentro da declaração de classe. Fora, eu posso criar variáveis com esse nome. O in poderia ser reservada apenas na declaração do for :smiley:

cv1

E tem gente que ainda arrisca a propria dignidade programando nisso? Uau. E fazem aquele escandalo todo com trafico de criancas. Tsc, tsc.

renatosilva

Fugindo do assunto, qual seria o problema disso?? Ou para você é apenas gambiarra? :smiley:

louds

Minha esperança com generics era que teriamos o mesmo poder do c++ de criar DSLs dentro da linguagem.

cv1

Eh, mas do jeito que ta, falhou… tambem, se fossem incluir tudo que tinha nos templates do C++, a gente tava ate hoje esperando pelo Java 5… ou tinha corrido pra linguagem mais proxima :mrgreen:

louds

Será mesmo? Não vi muitas tentativas nesse sentido por ai. Todas linguagens criadas em cima da JVM adicionam closures, method pointers e montes de firulas.

Criado 18 de abril de 2005
Ultima resposta 19 de abr. de 2005
Respostas 26
Participantes 9