OOP | Polimorfismo

Lilian Lima
Devs JavaGirl
Published in
4 min readAug 20, 2019

Dizem que nas entrevistas as respostas a essa pergunta costumam ser um show de horror. E você como responderia a esse conceito core da programação orientada a objetos? Recorreria a etimologia da palavra? Poli+formas ou múltiplas formas?

A JVM é organizada em 5 áreas sendo as 2 detalhadas abaixo as mais citadas:

Stack: Contém as referências dos objetos armazenados na Heap, os valores de tipos primitivos (int, short, etc) e o empilhamento de invocação de métodos. Sabe quando ocorre uma exception no Java e você vê a Stack Trace impressa no console? Então essa informação é obtida da Stack.

Heap: É onde os objetos ficam armazenados.

Você sabe dizer o que significa a seguinte declaração?

FormaGeometrica forma = new Circulo();

Nos bastidores estamos criando uma referência, que fica armazenada na Stack, para um endereço de memória na Heap que será “populado” quando um objeto for instanciado:

Nessa declaração FormaGeométrica é uma abstração de círculo, triângulo, retângulo e outras formas, ou inversamente dizendo, todo círculo, triângulo, retângulo é uma forma geométrica. Posto isso, quando pensamos em poli formas do que estamos falando? Estamos falando dos múltiplos tipos para os quais uma determinada referência, que está associada a um supertipo ou a uma abstração, pode apontar. Observem que isso proporciona que os objetos possuam diferentes formas, porém uma forma padronizada de interação, que se dá através da referência associada a um supertipo. No nosso exemplo, forma pode referenciar ou interagir com todos os objetos que sejam implementações de FormaGeométrica.

Um exemplo de polimorfismo muito utilizado por desenvolvedores Java é a interface List da API de Collections, antes confiram a hierarquia no diagrama de classes:

Uma declaração como:

List lista;

declara que a variável lista pode referenciar/apontar para objetos dos subtipos ArrayList, LinkedList ou Vector, os quais implementam a interface List. E essa variável pode acessar todos os métodos especificados no supertipo, que nesse caso é a interface List. Contudo, vale falar que a implementação desses métodos é realizada pelos subtipos. Para visualizar melhor considere o método add cuja assinatura é:

public boolean add(E e);

esse método possui o mesmo comportamento entre os subtipos, isto é, a implementação tanto na classe ArrayList quanto na LinkedList e Vector adicionará um elemento a lista e retornará um boolean indicando se esta foi ou não alterada após a inserção. Porém cada um dos subtipos aplica estratégias de implementação diferentes, por exemplo, se você tem inserção recorrente LinkedList é mais performática.A sobrescrita de métodos (overriding em inglês) é uma maneira de alcançar polimorfismo.

Se estivermos trabalhando com heranças, que também é uma aplicação de polimorfismo, é possível realizar a sobrecarga de métodos, que consiste na “extensão” do comportamento de um método. Na prática é como se eu extendesse ArrayList e sobrecarregasse o método add com a suposta assinatura:

public boolean add (E e, E outroAtributo)

Segundo o Uncle Bob só há um benefício real para o polimorfismo, mas esse é um grande benefício: o desacoplamento, proporcionado pelas interfaces polimórficas, entre a funcionalidade chamadora e a funcionalidade chamada no momento do desenvolvimento. Em outras palavras e voltando ao primeiro exemplo, quando eu construo a interface FormaGeométrica tendo o método desenhar() na sua especificação, eu propicio que a classe QuadroBranco invoque-o sem que esta precise conhecer todas as implementações existentes para ela, se Círculo, Retângulo, Losango, whatever, conforme sugerido no exemplo abaixo:

public class QuadroBranco{
public void imprimir(FormaGeometrica forma){
forma.desenhar();
}
}

Esse ponto de extensibilidade criado, ou nas palavras do mesmo Uncle Bob: essa possibilidade da funcionalidade chamada atuar como plugin, ou ainda a generalização da interação, ou como você queira descrever, a aplicação do polimorfismo agrega valor ao seu negócio ao passo que poupa esforços e tempo na evolução do seu produto, uma vez que as mudanças estão absorvidas pela abstração, o que se torna muito relevante para o alcance de um time to market diferenciado.

Agora é com você o desafio da abstração! 😉

Pratique desde já, acesse o projeto whiteboard e faça o exercício proposto.

Referências:
https://dzone.com/articles/java-memory-management
https://blog.cleancoder.com/uncle-bob/2014/11/24/FPvsOO.html

Revisão: Diego Junior Pereira e Felipe Santos.

--

--

Lilian Lima
Devs JavaGirl

{“ocupação”: “software engineer”, “idioma computacional”: “java”, “um hobby”:” escrever”,” um valor”:” justiça social”, “um amor”: “minha família 💙”}