Java Language Utilité des interfaces


Exemple

Les interfaces peuvent être extrêmement utiles dans de nombreux cas. Par exemple, disons que vous avez une liste d’animaux et que vous souhaitez parcourir la liste en imprimant chacun le son qu’ils font.

{cat, dog, bird}

Une façon d'y parvenir serait d'utiliser des interfaces. Cela permettrait d'appeler la même méthode sur toutes les classes

public interface Animal {
    public String getSound();
}

Toute classe qui implements Animal doit également avoir une méthode getSound() , mais toutes peuvent avoir des implémentations différentes

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";
    }
}

Nous avons maintenant trois classes différentes, chacune ayant une méthode getSound() . Comme toutes ces classes implement l'interface Animal , qui déclare la méthode getSound() , toute instance d'un Animal peut être appelée sur getSound()

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

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

Parce que chacun de ces Animal est un Animal , nous pourrions même mettre les animaux dans une liste, les parcourir en boucle et imprimer leurs sons.

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

Comme l'ordre du tableau est Dog , Cat , puis Bird , "Woof Meow Chirp" sera imprimé sur la console.

Les interfaces peuvent également être utilisées comme valeur de retour pour les fonctions. Par exemple, retourner un Dog si l'entrée est "chien" , Cat si l'entrée est "chat" , et Bird si c'est "oiseau" , et imprimer le son de cet animal pourrait être fait en utilisant

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

Les interfaces sont également utiles pour l'extensibilité, car si vous souhaitez ajouter un nouveau type d' Animal , vous n'avez rien à changer avec les opérations que vous effectuez.