O básico sobre genéricos em Java

O básico sobre genéricos em Java

Já vi  muitos materiais que retratam sobre teorias de genéricos e seu funcionamento. Inclusive, seu uso com Reflection, utilizado para um desenvolvimento mais avançado em Java. Todavia, ainda não vi material que mostra um exemplo simples, porém prático, sobre o uso dos genéricos na referida tecnologia.

E esse é meu objetivo neste post. Mostrar uma idéia simples, mas real, do que os genéricos em Java podem fazer.

Diga-se de passagem, que você precisa imprimir em tela 2 tipos de arrays, um de inteiros e um de Strings, logo se você não usa genéricos em Java sua classe poderia ser mais ou menos assim…

public class Main {
   public static void main(String[] args) {
     Integer [] i = {1,2,3,4,5};
     String [] S = {"A","B","C","D","E"};
     Main m = new Main();
     m.printArray(i);
     m.printArray(S);
}

   public void printArray(int [] inputArray){
      for( int element: inputArray ){
         System.out.printf("%s", element);    }
   }    

   public void printArray(String [] inputArray){
      for( String element: inputArray ){
          System.out.printf("%s", element);
      }
   }
}

Note que nesta situação criei 2 métodos sobrecarregados na linha 14 e na linha 20. Onde um recebe como parâmetro um array de ints e outro um array de Strings .

No método Main (linha 3) crio os 2 tipos de arrays (linha 4 e linha 5) e nas linhas 6 e 7 chamado meu método printArray, passando cada um dos arrays. O compilador do Java como não é ”bobo” nem nada chama a versão correspondente de cada uma das chamadas, conforme o tipo do argumento mencionado em ordem no método. É meus caros amigos, isto é Java!!

O problema é que se pararem pra pensar comigo, isso é legal! Pois criei dois métodos e até aí tudo “lindo”. Mas, digamos que se tivesse que imprimir vários tipos diferentes de array em tela, então logo, para cada tipo de objeto teríamos que ter um método para tal efeito. Correto? Não, se você usar um Genérico.

Vejam….

public class Main {

   public static void main(String[] args) {
      Integer [] i = {1,2,3,4,5};
      String [] S = {"A","B","C","D","E"};
      Main m = new Main();
      m.printArray(i);
      m.printArray(S);
   }

   public  void printArray( E[] inputArray ){
      for( E element: inputArray ){
         System.out.printf("%s", element);
      }
      System.out.println();
   }
}

Note que agora eu só tenho uma declaração do método printArray usando o genérico <E> na chamada do método na linha 11.

Assim, fica garantido que mais de um tipo definido de array possa passar para aquele mesmo método. E sem necessidade de escrever as outras versões, de modo que sobrecarregue. E a partir dessa pequena demonstração,  consegue-se ter uma noção do poder dos genéricos em Java.

E para aqueles com um pouco mais de conhecimento na linguagem, peço que pensem na idéia, por exemplo,  de uma classe DAO genérica, que se pode usar em qualquer tipo de VO’s. Para tanto, utilize uma implementação de uma classe AbstractDAO. E isso sem precisar escrever um método para cada tipo de VO. Intrigante, não?

Tags:
Sem Comentários

Envie um comentário