quinta-feira, 22 de dezembro de 2016

[JAVA] Anotação @Override


Fala galera que acompanha o blog...

Resolvi criar esse post especificamente sobre a Annotation @Override, pois é uma anotação muito comum quando estamos trabalhando com Orientação a Objetos e muita gente usa sem saber o porque de estar usando. Normalmente depois de uma refatoração o sistema para de funcionar, as vezes com umas mensagens estranhas. Então vamos entender o que acontece "por baixo dos panos".



Para início de conversa, a anotação @Override é uma forma de garantir que você está sobre escrevendo um método na super classe, e não criando um novo método.

Vamos ter como exemplo essa "Super" classe: 

public class SuperClasse {
    public void showMe() {
      System.out.println("Estou aqui SuperClasse");
    }
}

Certo, temos a nossa classe SuperClasse, que possui o método showMe(), que escreve uma mensagem no console.

Criamos uma nova classe (NovaClasse) no nosso projeto que estende a classe SuperClasse, e você gostaria de sobrescrever o método showMe(), pois é necessário que seja apresentado uma outra mensagem.  Então temos a seguinte classe:

public class NovaClasse extends SuperClasse {
       public void showMe() {
           System.out.println("Eu sou a NovaClasse");
       }
}

Perfeito! Acabamos de sobrescrever o método showMe(), da nossa SuperClasse e em momento algum usamos a anotação @Override e esse código funciona perfeitamente. Mas,  um amigo no projeto que você trabalha resolveu mudar o nome do método da sua classe SuperClasse de showMe() para showMessage().

E ai, percebeu o problema?

Nesse momento o seu projeto possui 2 métodos distintos:
SuperClasse possui o método showMessage();
NovaClasse possui o método showMe();

Se seu amigo, ou até mesmo você em uma fatoração, que seja, não se lembrar da sua classe NovaClasse que estendeu SuperClasse, que sobrescrevia um método dela... você terá um método que não está sobrescrevendo coisa nenhuma!

Mas, e se você tivesse usado a anotação @Override?

public class SuperClasse {
    public void showMe() {
       System.out.println("Estou aqui SuperClasse");
    }
}

public class NovaClasse extends SuperClasse {

  @Override
  public void showMe() {
     System.out.println("Eu sou a NovaClasse");
  }

}


Até aqui tudo certo. Mas, quando seu amigo, ou você, resolver mudar o seu método de showMe() para showMessage(), o seu código não irá compilar, pois o @Override vai perceber que não está sobrescrevendo coisa nenhuma, por não vai existir um método showMe() na classe SuperClasse() e vai te mostrar uma mensagem com de erro:

NovaClasse() must override or implement a supertype method


Dessa forma deverá ser alterar o nome do método da classe NovaClasse() também para showMessage(), para que o código volte a funcionar perfeitamente. Assim, o @Override acaba servindo como um lembrete.

Bom pessoal, um post básico, mas muito importante pra quem trabalha com Orientação a Objetos, esse exemplo foi para a linguagem JAVA, mas vários outras linguagens OO possuem a sua forma de anotação de sobrescrita, especificamente o JAVA, optou por @Override.

Até a próxima.
Luiz Fagner Zordan Analista de Sistemas

Graduado em Sistemas de Informação, atualmente trabalhando na Embraer pela FocusNetworks como FullStack. Sou apaixonado por tecnologia, fascinado por jogos e adoro passar o tempo assistindo séries.