Java Language Utilità delle interfacce


Esempio

Le interfacce possono essere estremamente utili in molti casi. Ad esempio, supponiamo di avere una lista di animali e di voler scorrere l'elenco, ognuno dei quali stampa il suono che produce.

{cat, dog, bird}

Un modo per farlo sarebbe utilizzare le interfacce. Ciò consentirebbe lo stesso metodo per essere chiamato su tutte le classi

public interface Animal {
    public String getSound();
}

Qualsiasi classe che implements Animal deve avere anche un metodo getSound() , tuttavia possono avere implementazioni diverse

public class Dog implements Animal {
    public String getSound() {
        return "Woof";
    }
}

public class Cat implements Animal {
    public String getSound() {
        return "Meow";
    }
}

public class Bird implements Animal{
    public String getSound() {
        return "Chirp";
    }
}

Ora abbiamo tre diverse classi, ognuna delle quali ha un metodo getSound() . Poiché tutte queste classi implement l'interfaccia Animal , che dichiara il metodo getSound() , qualsiasi istanza di un Animal può avere getSound() chiamato su di esso

Animal dog = new Dog();
Animal cat = new Cat();
Animal bird = new Bird();

dog.getSound(); // "Woof"
cat.getSound(); // "Meow"
bird.getSound(); // "Chirp"

Poiché ognuno di questi è un Animal , potremmo persino inserire gli animali in un elenco, scorrerli tra loro e stampare i loro suoni

Animal[] animals = { new Dog(), new Cat(), new Bird() };
for (Animal animal : animals) {
    System.out.println(animal.getSound());
}

Poiché l'ordine dell'array è Dog , Cat e quindi Bird , "Woof Meow Chirp" verrà stampato sulla console.

Le interfacce possono anche essere utilizzate come valore di ritorno per le funzioni. Ad esempio, restituendo un Dog se l'input è "dog" , Cat se l'input è "cat" e Bird se è "bird" , e quindi si può stampare il suono di quell'animale usando

public Animal getAnimalByName(String name) {
    switch(name.toLowerCase()) {
        case "dog":
            return new Dog();
        case "cat":
            return new Cat();
        case "bird":
            return new Bird();
        default:
            return null;
    }
}

public String getAnimalSoundByName(String name){
    Animal animal = getAnimalByName(name);
    if (animal == null) {
        return null;
    } else { 
        return animal.getSound();
    }
}

String dogSound = getAnimalSoundByName("dog"); // "Woof"
String catSound = getAnimalSoundByName("cat"); // "Meow"
String birdSound = getAnimalSoundByName("bird"); // "Chirp"
String lightbulbSound = getAnimalSoundByName("lightbulb"); // null

Le interfacce sono anche utili per l'estensibilità, perché se si desidera aggiungere un nuovo tipo di Animal , non è necessario modificare nulla con le operazioni eseguite su di esse.