quinta-feira, 19 de julho de 2012

A importância do @Override

Muitas vezes me questionaram a respeito dessa anotação. Como ela foi projetada para ser descartada após a compilação, muita gente ignora seu uso. O objetivo desse artigo, é mostrar os recursos que esta anotação provem e que sua falta pode trazer buracos difíceis de localizar.

Observe a classe abaixo:

class Movel{
    public void andar(Movel veiculo){
      System.out.println("andou...");
    }
}
Partindo do princípio, a anotação @Override serve para indicar que o método anotado por ela é um método sobrescrito de super-classe. Vamos criar uma classe Carro que irá estender a classe acima:
class Carro extends Movel{
    public void andar(Carro veiculo){
      System.out.println("o carro andou...");
    }
}

Não há problemas no meu código. Mas há um detalhe. Com essa abordagem, eu estarei sobrecarregando o método ao invés de sobrescrever. Observe a sua assinatura. O método da super-classe recebe um Movel, enquanto seu método filho recebe um Carro. Minha intenção foi sobrescrever o método da classe pai, porém eu acabei esquecendo a sua assinatura e troquei o tipo do seu parâmetro. Agora vamos anotar o método com @override.
class Carro extends Movel{
    @Override
    public void andar(Carro veiculo){
      System.out.println("o carro andou...");
    }
}

Em tempo de compilação, ele já avisa:
The method andar(Movel) of type Movel must override or implement a supertype method.
Concluindo, use consistentemente a anotação @Override (Java Efetivo: item 36) para prevenir-se de sobrescrita inválida e indesejada de métodos da super-classe.

Nenhum comentário:

Postar um comentário