Interface em Java

Interface em java é um dos conceitos principais. A interface Java é uma parte fundamental da linguagem de programação Java e é amplamente utilizada não apenas no JDK, mas também nos padrões de design Java. A maioria dos frameworks utiliza interfaces Java intensamente.

Interface em Java

A interface em java fornece uma maneira de alcançar abstração. A interface Java também é usada para definir o contrato para as subclasses implementarem. Por exemplo, digamos que queiramos criar um desenho consistindo de várias formas. Aqui podemos criar uma interface Shape e definir todos os métodos que diferentes tipos de objetos Shape implementarão. Para simplificar, podemos manter apenas dois métodos – draw() para desenhar a forma e getArea() que retornará a área da forma.

Exemplo de Interface Java

Com base nos requisitos acima, nossa interface Shape ficará assim. Shape.java

package com.journaldev.design;

public interface Shape {

	//implicitamente público, estático e final
	public String LABLE="Shape";
	
	//métodos de interface são implicitamente abstratos e públicos
	void draw();
	
	double getArea();
}

Pontos Importantes sobre Interface em Java

  1. interface é o código usado para criar uma interface em Java.

  2. Não podemos instanciar uma interface em Java.

  3. A interface fornece abstração absoluta, no último post aprendemos sobre classes abstratas em Java para fornecer abstração, mas as classes abstratas podem ter implementações de métodos, enquanto a interface não pode.

  4. Interfaces não podem ter construtores porque não podemos instanciá-las, e interfaces não podem ter um método com corpo.

  5. Por padrão, qualquer atributo de uma interface é public, static e final, então não precisamos fornecer modificadores de acesso para os atributos, mas se o fizermos, o compilador também não reclama.

  6. Por padrão, os métodos de uma interface são implicitamente abstract e public, faz total sentido, pois o método não possui corpo, permitindo que subclasses forneçam a implementação do método.

  7. Uma interface não pode estender nenhuma classe, mas pode estender outra interface. public interface Shape extends Cloneable{} é um exemplo de uma interface que estende outra interface. Na verdade, o Java permite herança múltipla em interfaces, o que significa que uma interface pode estender várias interfaces.

  8. A palavra-chave implements é usada por classes para implementar uma interface.

  9. Uma classe que implementa uma interface deve fornecer a implementação para todos os seus métodos, a menos que seja uma classe abstrata. Por exemplo, podemos implementar a interface acima em uma classe abstrata como esta: ShapeAbs.java

    pacote com.journaldev.design;
    
    public abstract class ShapeAbs implements Shape {
    
    	@Override
    	public double getArea() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    }
    
  10. Sempre devemos tentar escrever programas em termos de interfaces em vez de implementações, para que saibamos antecipadamente que as classes de implementação sempre fornecerão a implementação e, no futuro, se alguma implementação melhor chegar, podemos alternar facilmente para ela.

Exemplo de Implementação de Interface Java

Agora vamos ver algumas implementações de nossa interface Shape em java. Circle.java

package com.journaldev.design;

public class Circle implements Shape {

	private double radius;

	public Circle(double r){
		this.radius = r;
	}
	
	@Override
	public void draw() {
		System.out.println("Drawing Circle");
	}
	
	@Override
	public double getArea(){
		return Math.PI*this.radius*this.radius;
	}

	public double getRadius(){
		return this.radius;
	}
}

Repare que a classe Circle implementou todos os métodos definidos na interface e também possui alguns de seus próprios métodos, como getRaio(). As implementações de interface podem ter vários tipos de construtores. Vamos ver outra implementação de interface para a interface Shape. Rectangle.java

package com.journaldev.design;

public class Rectangle implements Shape {

	private double width;
	private double height;
	
	public Rectangle(double w, double h){
		this.width=w;
		this.height=h;
	}
	@Override
	public void draw() {
		System.out.println("Drawing Rectangle");
	}

	@Override
	public double getArea() {
		return this.height*this.width;
	}

}

Observe o uso da anotação de sobrescrita, aprenda sobre anotações em java e por que devemos sempre usar a anotação de sobrescrita ao substituir um método em java. Aqui está um programa de teste mostrando como codificar em termos de interfaces e não de implementações. ShapeTest.java

package com.journaldev.design;

public class ShapeTest {

	public static void main(String[] args) {
		
		//programação para interfaces não implementação
		Shape shape = new Circle(10);
		
		shape.draw();
		System.out.println("Area="+shape.getArea());
		
		//mudando facilmente de uma implementação para outra
		shape=new Rectangle(10,10);
		shape.draw();
		System.out.println("Area="+shape.getArea());
		}

}

A saída do exemplo de programa de interface java acima é:

Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0

Benefícios da Interface Java

  1. A interface fornece um contrato para todas as classes de implementação, então é bom codificar em termos de interfaces porque as classes de implementação não podem remover os métodos que estamos usando.
  2. As interfaces são boas para definir o Tipo e criar uma hierarquia de nível superior em nosso código.
  3. Como uma classe Java pode implementar múltiplas interfaces, é melhor usar interfaces como superclasse na maioria dos casos.

Desvantagens da Interface Java

Embora as interfaces forneçam muitas vantagens, elas também têm algumas desvantagens.

  1. Precisamos escolher os métodos da interface com muito cuidado no momento de projetar nosso projeto, porque não podemos adicionar ou remover métodos da interface em um momento posterior. Isso levará a erros de compilação para todas as classes de implementação. Às vezes, isso leva a ter muitas interfaces estendendo a interface base em nosso código, o que se torna difícil de manter.

  2. Se as classes de implementação possuem seus próprios métodos, não podemos usá-los diretamente em nosso código porque o tipo de Objeto é uma interface que não possui esses métodos. Por exemplo, no código acima, receberemos um erro de compilação para o código shape.getRadius(). Para superar isso, podemos usar typecasting e usar o método assim:

    Círculo c = (Círculo) forma;
    c.getRaio();
    

    Embora o typecasting de classe tenha suas próprias desvantagens.

Isso é tudo que tenho para interface em Java. Como usamos interfaces Java muito, devemos estar cientes de suas características. Certifique-se de usar interfaces no projeto do sistema e como um contrato entre o cliente e as subclasses que implementam as interfaces. Atualização: O Java 8 mudou a definição de interfaces com a introdução de métodos padrão e implementação de métodos estáticos. Para mais detalhes, por favor, leia Interface Java 8.

Source:
https://www.digitalocean.com/community/tutorials/interface-in-java