Olá desenvolvedores, hoje daremos início ao nosso estudo sobre interfaces em Java. As interfaces também fazem parte do contexto do polimorfismo e compreendem uma relação de herança. E uma relação um tanto quanto complexa, visto que o Java permite apenas uma superclasse direta para uma classe. Interfaces é o jeito de contornar esta limitação imposta.
Dessa forma definimos interfaces como um tipo diferente de classes. O que a torna diferente, entre outras características, é que ela pode ser composta por zero ou mais métodos sem escopo (apenas com a assinatura). Assim como por zero ou mais variáveis. Como exemplo, podemos citar um método de autenticação para logar em um sistema.
Ela funciona como uma espécie de contrato, onde quem assina assume a responsabilidade de implementá-la. Desse modo, a interface compreende também um meio de autorizar seja uma classe ou um objeto a fazer algo.
Outra importante diferença é que objetos não podem ser definidos a partir de interfaces. Entretanto ela expõe o que o objeto deve fazer, ela dita as regras, mas não diz como estas regras devem ser cumpridas. E tampouco ela diz o que um objeto deve conter. Assim, o como fazer deverá ser definido na implementação dessa interface em outra classe.
Agora, atente-se para o detalhe de que uma declaração de interfaces é definida por meio da palavra reservada “interface”. E ela contém somente constantes e métodos abstract. Enquanto que para utilizá-las é indicado a palavra-chave implements.
O segredo para entender interfaces é compreender onde elas se encaixam dentro de uma solução. Assim sendo, este é o maior objetivo deste tutorial. Vamos tentar visualizar a seguinte questão: Queremos que apenas o secretário escolar tenha permissão de acesso ao sistema.
ARQUITETURA DE INTERFACE
Como solucionaríamos a questão colocada acima? A solução passa pela implementação na classe Secretario de uma interface que mostra, obriga e realiza essa liberação ao sistema.
E porque não fazemos este contrato na classe pessoa, você deve estar se perguntando. Não o fazemos porque se o fizermos todos irão enxergar esta rotina, este contrato.
Considere o Diagramas de classe visto em “HERANÇA: SINTAXE CORRETA”. A partir dele tentaremos agora estabelecer uma visão mais abrangente acerca das interfaces.
A ideia não é que somente o secretário tenha permissão para acessar o sistema. Também não podemos permitir que neste momento “aluno” e “diretor” tenham acesso ao sistema ou enxerguem a permissãos. Dessa forma o método de autenticação será implementado, ou seja, um contrato será estabelecido com o secretário, e somente com ele.
public interface PermitirAcesso{
public boolean autenticar();
}
E dentro da classe Secretario é que será implementada a regra de negócio, isto é, as regras que regem este “contrato”.
DIFERENÇA ENTRE MÉTODO ABSTRATO E HERANÇA
No que diz respeito a ABSTRAÇÃO E HERANÇA, dentro do contexto do nosso exemplo de um sistema escolar, vejamos o que temos. Se implementarmos o método PermitirAcesso na classe Pessoa ou mesmo se implementarmos uma classe abstrata, todos os tipos de Pessoa irão enxergar a rotina e poderão ter acesso. Não é o que queremos.
A herança e a abstração até podem resolver este problema, mas somente em partes. Visto que causará outros contratempos que tornarão difícil a manutenção do sistema.
Quanto a INTERFACE, quando a utilizamos conseguimos fazer um contrato com o tipo de Pessoa secretário, e com isso restringir a apenas ele o acesso ao sistema. Entretanto, se em um dado momento for necessário conceder acesso também ao diretor, neste caso ele também deverá implementar a interface.
A permissão e o contrato só devem ser expostos a quem realmente for necessário dar a permissão.
EM POUCAS PALAVRAS
As interfaces compreendem um recurso do Java onde classes que não estão relacionadas podem implementar um conjunto de métodos comuns. Deitel traz uma ideia bastante interessante, onde diz que as interfaces implementam um padrão de como pessoas e sistemas poderão interagir entre si.
Assim sendo, elas definem quais ações este ou aquele tipo de Pessoa poderá ter dentro do sistema. Mas não cabe a elas especificar como estas ações se darão. Isso porque as interfaces não podem especificar nenhum detalhe de implementação, como declarações de método e variáveis de instância.
Enfim hoje aprendemos também que para utilizarmos uma interface, uma classe concreta deve especificar que ela implementa a interface (implements). E ainda, declarar cada método na interface com a assinatura especificada na declaração de interface.
É isso desenvolvedores, espero que tenham gostado e entendido o conceito de interfaces. Aguarde o próximo tutorial e veja na prática como implementar uma interface.