Interfaccia in Java

Interfaccia in Java è uno dei concetti fondamentali. L’interfaccia Java è una parte essenziale del linguaggio di programmazione Java e viene ampiamente utilizzata non solo nel JDK ma anche nei pattern di progettazione Java. La maggior parte dei framework fa un ampio uso dell’interfaccia Java.

Interfaccia in Java

L’interfaccia in Java fornisce un modo per raggiungere l’astrazione. L’interfaccia Java viene anche utilizzata per definire il contratto che le sottoclassi devono implementare. Ad esempio, supponiamo di voler creare un disegno composto da forme multiple. Qui possiamo creare un’interfaccia Shape e definire tutti i metodi che gli oggetti di forma di diversi tipi implementeranno. A scopo di semplicità, possiamo mantenere solo due metodi – draw() per disegnare la forma e getArea() che restituirà l’area della forma.

Esempio di Interfaccia in Java

In base ai requisiti sopra indicati, la nostra interfaccia Shape avrà un aspetto simile a questo. Shape.java

package com.journaldev.design;

public interface Shape {

	//implicitamente pubblici, statici e finali//i metodi dell'interfaccia sono implicitamente astratti e pubblici
	public String LABLE="Shape";
	
	//metodi dell'interfaccia sono implicitamente astratti e pubblici
	void draw();
	
	double getArea();
}

Punti Importanti sull’Interfaccia in Java

  1. interface è il codice che viene utilizzato per creare un’interfaccia in java.

  2. Non possiamo istanziare un’interfaccia in java.

  3. L’interfaccia fornisce un’astrazione assoluta, nell’ultimo post abbiamo appreso delle classi astratte in java per fornire astrazione ma le classi astratte possono avere implementazioni dei metodi mentre le interfacce non possono.

  4. Le interfacce non possono avere costruttori perché non possiamo istanziarle e le interfacce non possono avere un metodo con un corpo.

  5. Per impostazione predefinita, qualsiasi attributo dell’interfaccia è pubblico, statico e finale, quindi non è necessario fornire modificatori di accesso agli attributi, ma se lo facciamo, il compilatore non si lamenta neanche.

  6. Per impostazione predefinita, i metodi dell’interfaccia sono implicitamente astratti e pubblici, ha senso totale perché il metodo non ha un corpo e quindi le sottoclassi possono fornire l’implementazione del metodo.

  7. Un’interfaccia non può estendere alcuna classe ma può estendere un’altra interfaccia. public interface Shape extends Cloneable{} è un esempio di un’interfaccia che estende un’altra interfaccia. In realtà, Java fornisce l’ereditarietà multipla nelle interfacce, ciò significa che un’interfaccia può estendere più interfacce.

  8. La parola chiave implements è utilizzata dalle classi per implementare un’interfaccia.

  9. Una classe che implementa un’interfaccia deve fornire l’implementazione per tutti i suoi metodi a meno che non sia una classe astratta. Ad esempio, possiamo implementare l’interfaccia sopra in una classe astratta come questa: ShapeAbs.java

    package com.journaldev.design;
    
    public abstract class ShapeAbs implements Shape {
    
    	@Override
    	public double getArea() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    }
    
  10. Dovremmo sempre cercare di scrivere programmi in termini di interfacce piuttosto che di implementazioni, in modo che sappiamo in anticipo che le classi di implementazione forniranno sempre l’implementazione e in futuro se arriva un’implementazione migliore, possiamo passare a quella facilmente.

Esempio di Implementazione di Interfaccia Java

Ora vediamo alcune implementazioni della nostra interfaccia Shape in 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;
	}
}

Nota che la classe Circle ha implementato tutti i metodi definiti nell’interfaccia ed ha anche alcuni suoi metodi come getRadius(). Le implementazioni dell’interfaccia possono avere diversi tipi di costruttori. Vediamo un’altra implementazione dell’interfaccia Shape in 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;
	}

}

Notare l’uso dell’annotazione override, apprendi di più su annotazioni in Java e perché dovremmo sempre utilizzare l’annotazione override quando si sovrascrive un metodo in Java. Ecco un programma di test che mostra come scrivere in termini di interfacce e non di implementazioni in ShapeTest.java

package com.journaldev.design;

public class ShapeTest {

	public static void main(String[] args) {
		
		//programmazione per interfacce, non per implementazioni
		Shape shape = new Circle(10);
		
		shape.draw();
		System.out.println("Area="+shape.getArea());
		
		//passare facilmente da un'implementazione all'altra
		shape=new Rectangle(10,10);
		shape.draw();
		System.out.println("Area="+shape.getArea());
		}

}

Il risultato del programma di esempio sull’interfaccia Java sopra è:

Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0

Vantaggi delle Interfacce in Java

  1. L’interfaccia fornisce un contratto per tutte le classi di implementazione, quindi è bene scrivere in termini di interfacce perché le classi di implementazione non possono rimuovere i metodi che stiamo utilizzando.
  2. Le interfacce sono utili come punto di partenza per definire il tipo e creare una gerarchia di alto livello nel nostro codice.
  3. Dal momento che una classe Java può implementare più interfacce, è meglio utilizzare le interfacce come superclasse nella maggior parte dei casi.

Svantaggi dell’Interfaccia Java

Anche se le interfacce forniscono molti vantaggi, hanno anche alcuni svantaggi.

  1. Dobbiamo scegliere con attenzione i metodi dell’interfaccia al momento di progettare il nostro progetto perché non possiamo aggiungere o rimuovere metodi dall’interfaccia in un secondo momento, ciò comporterà un errore di compilazione per tutte le classi di implementazione. A volte questo porta ad avere molte interfacce che estendono l’interfaccia di base nel nostro codice, il che diventa difficile da mantenere.

  2. Se le classi di implementazione hanno i propri metodi, non possiamo usarli direttamente nel nostro codice perché il tipo di oggetto è un’interfaccia che non ha quei metodi. Ad esempio, nel codice sopra otterremo un errore di compilazione per il codice shape.getRadius(). Per ovviare a questo, possiamo utilizzare il typecasting e utilizzare il metodo in questo modo:

    Cerchio c = (Cerchio) forma;
    c.getRaggio();
    

    Anche il typecasting delle classi ha i suoi svantaggi.

E questo è tutto quello che ho per l’interfaccia in Java. Poiché usiamo molto l’interfaccia Java, dovremmo essere consapevoli delle sue caratteristiche. Assicurati di utilizzare le interfacce nella progettazione del sistema e come contratto tra il client e le sottoclassi che implementano le interfacce. Aggiornamento: Java 8 ha cambiato la definizione delle interfacce con l’introduzione di metodi di default e implementazioni di metodi statici. Per maggiori dettagli, si prega di leggere Interfaccia Java 8.

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