Afinal, existe utilidade no uso dos modificadores public, abstract e final em parâmetros, métodos ou na declaração de Interfaces em Java?

Icone do Java

Para a comunidade Java, não é mais uma novidade que uma interface nada mais é do que a especificação das funcionalidades de uma classe. Nela, não há implementação de métodos e para muitos é considerada como uma “classe abstrata pura”, afinal, todos os seus métodos são implicitamente abstract e public e todos os atributos são implicitamente static e final. No entanto, será que você alguma vez já se perguntou então porque que nesses tipos é possível a utilização dos modificadores public, abstract ou final em métodos, nos parâmetros ou até mesmo na declaração da interface? Neste artigo, abordo essa curiosidade.

Para começar, vamos observar o uso do modificador abstract no seguinte trecho de código:

abstract interface UmaInterface {

     abstract void chamaUmMetodo();

}

Em Java, a palavra “abstract” possui a funcionalidade de forçar a implementação nas sub-classes dos métodos abstratos especificados. No entanto, por definição, todos os métodos de uma interface são abstratos, ou seja, declarar esse modificador em uma interface seria praticar uma redundância de implementação. Isso levou a Sun a considerar essa implementação obsoleta e a promover que os programadores evitem esse caso de uso. O único real motivo para a existência desse modificador é apenas a retro-compatibilidade e é por isso deve ser evitada.

Vamos observar agora o modificador public no seguinte trecho de código:

public interface UmaInterface {

     public void chamaUmMetodo();

}

Assim como acontece com o modificador abstract, o modificador public pode ser usado tanto na declaração do método como da própria interface mas é também considerada obsoleta ainda que permitida para garantia de retro-compatibilidade. O modificador public nada mais é que outra propriedade implícita da interface e nos métodos dela.

E por fim, vamos analisar o uso do modificador final no seguinte trecho de código.

interface UmaInterface {

	void chamaUmMetodo(final int comUmParametro);

}

A principio, o modificador final não pode ser declarado como modificador da interface porque gera um erro de compilação e o mesmo acontece quando é aplicado sobre os métodos daquela mesma interface. Ao meu ver, se existisse a possibilidade de usar essa palavra reservada na própria interface, entendo que representaria que ela não pode ser mais estendida por outras interfaces (extends) apesar de que continuaria possibilitando a implementação(implements) por outras classes.

O mais interessante é que final pode ser aplicado sobre parâmetros de um método de interface mas gera o mesmo byte-code que geraria se a palavra fosse retirada! Isso significa que você ao estender a interface simplesmente pode declarar o parâmetro do método sobrescrito sem esse modificador  e isso acontece porque esse modificador não influencia na assinatura do método que é abstrato!

Por fim, em todos os casos mostrados, os modificadores public, abstract e final são redundâncias e deveriam ser evitados a menos que, por motivo especial (por exemplo uma documentação mais especifica), essa repetição torne-se de alguma forma mais interessante.

Referências
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html
http://stackoverflow.com/questions/6401339/what-difference-does-it-make-to-declare-a-java-interface-method-signature-as-fina
http://stackoverflow.com/questions/5380177/final-arguments-in-interface-methods-whats-the-point
http://www.javacamp.org/javaI/Modifier.html
http://en.wikipedia.org/wiki/Interface_(Java)
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.12.4

Anúncios