Orientação a Objetos: Modificador Final para Métodos e Classes Alcides Calsavara
Qualificador final em métodos e classes Em um método: indica que o método não pode ser sobrecarregado (redefinido em subclasses) Em uma classe: indica que a classe não pode ser especializada (o que implica que todo método da classe é final).
Finalização de um método Razão única: eficiência! Um método final é expandido (in-line) em todo local onde é chamado, dispensando ligação dinâmica. Recomendação de uso: para métodos acessores (get, put), pois não devem ser sobrecarregados por subclasses. final por default: métodos private, static e métodos de classe final.
Finalização de um método - Exemplo 1 class Trem { public final void acelere(float veloc) { ... } ... } ... Trem t = new Trem ( ... ) ; t.acelere (80.0f); // expansão in-line
Finalização de um método - Exemplo 2 class Pessoa { private int idade; private String nome; public Pessoa(int i, String n) { idade = i; nome = n; } // métodos acessores public final int get_idade( ) { return idade; } public final String get_nome( ) { return new String(nome); } public final void set_idade(int i) { idade = i; } public final void set_nome(String s) { nome = s; } // outros métodos ... }
Finalização de uma classe Razões: Evitar que outros especializem a sua classe, pois esta já está concebida de forma completa (não faltam atributos e nem métodos). Exemplos: InetAddress, Socket. Para maior eficiência, pois não há possibilidade de haver instâncias mais especializadas e, assim, o código pode ser otimizado para manipular instâncias da classe final. Exemplo: String.
Finalização de uma classe - Exemplo final class Livro { private String titulo; private int ano; Livro (String t, int a) { titulo = t; ano = a; } public void imprime( ) { System.out.println(titulo + ano); } }