quinta-feira, 12 de fevereiro de 2009

Artigo: Classes Genéricas

Quem ja tem um pouco mais de experiência em JAVA sabe que existem determinadas classes que você pode trabalhar com qualquer tipo. Nesse artigo mostrarei como criar uma própria classe genérica.

Tudo que você deve fazer é iniciar sua Classe com class MinhaClasse<E>, agora você pode usar o E como um tipo. Quando um usuário da sua classe necessitar usar ela por exemplo com inteiros basta ele declarar uma variável dessa maneira <em>MinhaClasse<int> m = new MinhaClasse<int>.

Abaixo o exemplo completo:

public class MinhaClasse<E extends Comparable> {
private E valor1;
private E valor2;

public MinhaClasse() {
}

public MinhaClasse(E valor1, E valor2) {
this.valor1 = valor1;
this.valor2 = valor2;
}

public E getValor1() {
return valor1;
}

public void setValor1(E valor1) {
this.valor1 = valor1;
}

public E getValor2() {
return valor2;
}

public void setValor2(E valor2) {
this.valor2 = valor2;
}

public void maior() {
if(valor1.compareTo(valor2) > 0)
System.out.println("O maior valor e: " + valor1);
else if(valor2.compareTo(valor1) > 0)
System.out.println("O maior valor e: " + valor2);

System.out.println("Sao iguais");
}

public boolean iguais()
{
return valor1.equals(valor2);
}

public void menor()
{
if(valor1.compareTo(valor2) < 0)
System.out.println("O menor valor e: " + valor1);
else if(valor2.compareTo(valor1) < 0)
System.out.println("O menor valor e: " + valor2);

System.out.println("Sao iguais");
}
}

Declaramos uma classe que aceitrá qualquer tipo que tenha sido derivada da classe Comparable. Isso servirá para podermos utilizar a função compareTo(object o), esta função compara o valor da esquerda com o valor da direita e retorna -1 se o valor da esquerda for menor, 1 caso seja maior e 0 se forem iguais. Poderíamos usar diretamente os operadores < e > porém isso não é aconselhável com String. Todos os tipos primitivos já são derivados dessa classe ou tem implementado as funções da interface IComparable.
Para comparar se são iguais utilizamos a função já definida pelo JAVA equals(object o) que retorna true caso sejam iguais.

Agora é só utilizarmos nossa nova classe:

public class Main {

public static void main(String[] args) {
// declara uma variavel que so aceitara inteiros
MinhaClasse<Integer> mi = new MinhaClasse<Integer>(34, 12);

mi.maior();
mi.menor();

if(mi.iguais())
System.out.println("Sao iguais");

// declara uma varivel que so aceitara strings
MinhaClasse<String> ms = new MinhaClasse("Palavra1", "Palavra2");

ms.maior();
ms.menor();

if(ms.iguais())
System.out.println("Sao iguais");

// declara uma variavel que aceitara qualquer tipo
MinhaClasse mg = new MinhaClasse();

mg.setValor1(34.5);
mg.setValor2(34.5);

mg.maior();
mg.menor();

if(mg.iguais())
System.out.println("Sao iguais");
}

}

Nossa primeira variável trabalhará apenas com inteiros, repare que declaramos Integer e não int isso porque é a classe Integer que é derivada da classe Comparable. Nossa segunda variável poderá apenas trabalhar com String.
Ja nossa terceira variável poderá trabalhar com qualquer tipo, isso é permitido, chamamos isso de tipo bruto, isto é, não sabemos quais são os tipos que está armazenado seja na variável valor1 ou na variável valor2. Deve-se tomar muito cuidado quando se trabalhar com tipos brutos, por exemplo, mude qualquer uma da atribuição de um valor para string setValor1("Palavra"); e veja o que acontece. Para evitar esta excessão sua classe deve evitar essa comparação, essa é uma das prioridades quando se quer criar uma classe genérica. Faça isso como exercício, compare os tipos e permita ou não a utilização da função compareTo(object o) entre eles.

Você viu como é simples criar uma classe genérica em JAVA, e também que se deve ter alguns cuidados quando criá-la, espero que tenha entendido o conceito.

Boa sorte.