Interfaz en Java

La interfaz en java es uno de los conceptos principales. La interfaz de Java es una parte fundamental del lenguaje de programación Java y se usa mucho no solo en JDK sino también en patrones de diseño de Java. La mayoría de los frameworks utilizan mucho la interfaz de java.

Interfaz en Java

La interfaz en Java proporciona una forma de lograr la abstracción. La interfaz de Java también se utiliza para definir el contrato que deben implementar las subclases. Por ejemplo, digamos que queremos crear un dibujo que consta de varias formas. Aquí podemos crear una interfaz Shape y definir todos los métodos que implementarán los diferentes tipos de objetos Shape. Para simplificar, podemos mantener solo dos métodos – draw() para dibujar la forma y getArea() que devolverá el área de la forma.

Ejemplo de interfaz de Java

Basándonos en los requisitos anteriores, nuestra interfaz Shape se verá así. Shape.java

package com.journaldev.design;

public interface Shape {

	//implícitamente públicas, estáticas y finales
	public String LABLE="Shape";
	
	//los métodos de la interfaz son implícitamente abstractos y públicos
	void draw();
	
	double getArea();
}

Puntos importantes sobre la interfaz en Java

  1. interface es el código que se utiliza para crear una interfaz en Java.

  2. No podemos instanciar una interfaz en Java.

  3. La interfaz proporciona una abstracción absoluta, en la última publicación aprendimos sobre las clases abstractas en Java para proporcionar abstracción, pero las clases abstractas pueden tener implementaciones de métodos, mientras que las interfaces no pueden.

  4. Las interfaces no pueden tener constructores porque no podemos instanciarlas y las interfaces no pueden tener un método con cuerpo.

  5. De forma predeterminada, cualquier atributo de una interfaz es público, estático y final, por lo que no es necesario proporcionar modificadores de acceso, pero si lo hacemos, el compilador tampoco se queja.

  6. De forma predeterminada, los métodos de una interfaz son implícitamente abstractos y públicos, esto tiene mucho sentido porque los métodos no tienen cuerpo y así las subclases pueden proporcionar la implementación del método.

  7. Una interfaz no puede extender ninguna clase, pero puede extender otra interfaz. public interface Shape extends Cloneable{} es un ejemplo de una interfaz que extiende otra interfaz. En realidad, Java proporciona herencia múltiple en interfaces, lo que significa que una interfaz puede extender múltiples interfaces.

  8. La palabra clave implements se utiliza por las clases para implementar una interfaz.

  9. Una clase que implementa una interfaz debe proporcionar la implementación de todos sus métodos a menos que sea una clase abstracta. Por ejemplo, podemos implementar la interfaz anterior en una clase abstracta de la siguiente manera: ShapeAbs.java

    package com.journaldev.design;
    
    public abstract class ShapeAbs implements Shape {
    
    	@Override
    	public double getArea() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    }
    
  10. Siempre debemos intentar escribir programas en términos de interfaces en lugar de implementaciones, de modo que sepamos de antemano que las clases de implementación siempre proporcionarán la implementación y en el futuro, si llega una implementación mejor, podamos cambiar fácilmente a ella.

Ejemplo de Implementación de Interfaz en Java

Ahora veamos algunas implementaciones de nuestra interfaz Shape en 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;
	}
}

Tenga en cuenta que la clase Circle ha implementado todos los métodos definidos en la interfaz y también tiene algunos de sus propios métodos, como getRadius(). Las implementaciones de la interfaz pueden tener varios tipos de constructores. Veamos otra implementación de interfaz para la interfaz 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 el uso de la anotación @Override, aprenda sobre anotaciones en java y por qué siempre debemos usar la anotación @Override al sobrescribir un método en java. Aquí hay un programa de prueba que muestra cómo programar en términos de interfaces y no de implementaciones. ShapeTest.java

package com.journaldev.design;

public class ShapeTest {

	public static void main(String[] args) {
		
		//programación para interfaces, no para implementaciones
		Shape shape = new Circle(10);
		
		shape.draw();
		System.out.println("Area="+shape.getArea());
		
		//cambio fácilmente de una implementación a otra
		shape=new Rectangle(10,10);
		shape.draw();
		System.out.println("Area="+shape.getArea());
		}

}

La salida del programa de ejemplo de interfaz de Java anterior es:

Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0

Beneficios de las interfaces en Java

  1. La interfaz proporciona un contrato para todas las clases de implementación, por lo que es bueno programar en términos de interfaces porque las clases de implementación no pueden eliminar los métodos que estamos utilizando.
  2. Las interfaces son buenas para definir el tipo y crear una jerarquía de nivel superior en nuestro código.
  3. Dado que una clase Java puede implementar múltiples interfaces, en la mayoría de los casos es mejor usar interfaces como superclase.

Desventajas de las interfaces en Java

Aunque las interfaces proporcionan muchas ventajas, también tienen algunas desventajas.

  1. Necesitamos elegir los métodos de la interfaz con mucho cuidado al diseñar nuestro proyecto, porque no podemos agregar ni eliminar métodos de la interfaz en un momento posterior, lo que provocará errores de compilación en todas las clases de implementación. A veces, esto lleva a tener muchas interfaces que extienden la interfaz base en nuestro código, lo que se vuelve difícil de mantener.

  2. Si las clases de implementación tienen sus propios métodos, no podemos usarlos directamente en nuestro código porque el tipo de Objeto es una interfaz que no tiene esos métodos. Por ejemplo, en el código anterior obtendremos un error de compilación para el código shape.getRadius(). Para superar esto, podemos usar casting de tipos y usar el método de esta manera:

    Circle c = (Circle) shape;
    c.getRadius();
    

    Aunque el casting de tipos de clase tiene sus propias desventajas.

Eso es todo lo que tengo sobre interfaces en Java. Dado que usamos interfaces de Java mucho, debemos estar al tanto de sus características. Asegúrate de usar interfaces en el diseño del sistema y como un contrato entre el cliente y las subclases que implementan las interfaces. Actualización: Java 8 ha cambiado la definición de interfaces con la introducción de métodos por defecto y métodos estáticos de implementación. Para obtener más detalles, por favor lee Java 8 interface.

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