Mini Curso de Java – Parte 8


Olá pessoal. Esta é a oitava parte do nosso mini curso de Java que terá 11 partes. Ele é voltado para iniciantes, porém é recomendado que ao estudá-lo, você já tenha pelo menos algum conhecimento em lógica de programação. Se você perdeu:
a primeira parte, leia aqui; a segunda parte, leia aqui; a terceira parte, leia aqui; a quarta parte, leia aqui; a quinta parte, leia aqui; a sexta parte, leia aqui; a sétima parte, leia aqui;

Polimorfismo

Definição:
Na programação orientada a objetos, o polimorfismo permite que referências de tipos de classes mais abstratas representem o comportamento das classes concretas que referenciam. Assim, um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é importante pois permite que a semântica de uma interface seja efetivamente separada da implementação que a representa.

Beneficios do polimorfismo:
Em linguagens de programação não polimórficas, para implementar o método mostrarCalculo, seria necessário recorrer a uma enumeração com o tipo de operação e, dentro do método, testar o valor da enumeração com controle de condição.
public void mostrarCalculo (int operacao, double x, double y) {
…System.out.print(“O resultado é: “);
…switch (operacao) {
……case SOMA:
………System.out.print(“”+(x+y));
………break;
……case SUBTRACAO:
………System.out.print(“”+(x-y));
………break;
…}
}

Além do código ser maior e mais difícil de ler, essa implementação tem outros problemas. Provavelmente esse não será o único método a utilizar operações matemáticas e, portanto, pode-se esperar não um, mas vários controles de condições como esse pelo código. O que acontece, então, se uma nova operação for adicionada ao sistema? Será necessário que todos os controles de operações sejam encontrados e substituídos. Com o polimorfismo, a modificação restringiria-se apenas a criação de uma nova classe.

Com o polimorfismo pode-se separar métodos genéricos de métodos mais específicos, dividindo a aplicação de acordo com o seu grau de abstração. Bibliotecas que usam esse recurso (herança+polimorfismo) são chamadas frameworks.

O polimorfismo combinado à reflexão permite facilmente a criação de plugins. A aplicação original cria interfaces e classes que tem muito conhecimento semântico, mas a sua implementação efetiva ficará a cargo de terceiros. Uma aplicacao gráfica, por exemplo, poderia ser implementada de forma a desenhar linhas, formas e gráficos precisos de acordo com operações matemáticas fornecidas. Enquanto isso, empresas terceiras, nos diversos campos de sua atuação, implementariam as operações matemáticas específicas para o seu empreendimento (cálculos de órbitas para astronomia, cálculos estruturais para engenharia civil, balística para aeronáutica, etc).

Implementação:
Suponha que temos que implementar uma classe que faça o tratamento de operações aritméticas, vamos precisar de uma classe com um método para cada operação. Agora se utilizarmos polimorfismo precisaremos de uma classe abstrata e de classes que representam as operações.

Abaixo temos um exemplo de uso de polimorfismo com as classes de operações.
public abstract class OperacaoMatematica {
…public abstract double calcular(double x, double y);
}

public class Soma extends OperacaoMatematica {
…public double calcular(double x, double y) {
……return x + y;
…}
}

public class Subtracao extends OperacaoMatematica {
…public double calcular(double x, double y) {
……return x – y;
…}
}

public class Contas {
…public static void mostrarCalculo(OperacaoMatematica operacao, double x, double y) {
……System.out.println(“Resultado é: ” + operacao.calcular(x, y));
…}

…public static void main(String args[]) {
……// Primeiro calculamos uma soma
……Contas.mostrarCalculo(new Soma(), 5, 5);
……Contas.mostrarCalculo(new Subtracao(), 5, 5);
…}
}

Semana que vem estarei de volta com a parte 9 do Mini Curso de Java: Tratamento de Exceções. Até lá! 😉

Últimos 5 artigos de Tiago Souza

Sobre Tiago Souza

De Campinas-SP, bacharel em Ciência da Computação pela Anhanguera Educacional. Técnico em Processamento de Dados pelo Cotuca é desenvolvedor Web e trabalhou dois anos com desenvolvimento PHP e Java. Atualmente trabalha como desenvolvedor .Net (C#). Utilizando metodologia SCRUM, Também desenvolve aplicativos para Android por prazer.

Deixe uma resposta