JavaRush /Blog Java /Random-FR /Méthodes par défaut dans les interfaces

Méthodes par défaut dans les interfaces

Publié dans le groupe Random-FR
Chaque nouvelle version de Java est différente des précédentes. Voici un exemple des changements par rapport au matériel que nous avons couvert : Avant Java 5, il n'y avait pas enumde « » dans le langage.
Méthodes par défaut dans les interfaces - 1
De même, Java 8 est sensiblement différent de Java 7. La plupart de nos cours sont rédigés dans la 7ème version du langage, mais, bien entendu, nous n'ignorerons pas les innovations importantes. Puisque nous parlons d'interfaces dans cette conférence, examinons une mise à jour - les méthodes par défaut dans les interfaces . Vous savez déjà qu'une interface n'implémente pas . Sa tâche est de décrire le comportement que devraient avoir tous les objets qui l'implémentent . Mais bien souvent, les développeurs étaient confrontés à des situations où la mise en œuvre d'une méthode dans toutes les classes était la même. Regardons notre exemple de vieille voiture :
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
Selon vous, quel est le principal problème de ce code ? Vous avez probablement remarqué que nous avons écrit plusieurs du même code ! Ce problème est courant en programmation et doit être évité. Une autre chose est qu'avant la sortie de Java 8, il n'existait aucune option de solution spéciale. Lorsque cette version est sortie, il est devenu possible de définir des méthodes par défaut et de les implémenter directement dans l'interface ! Voici comment procéder :
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Désormais, les méthodes gas()et brake(), qui étaient les mêmes pour toutes les machines, sont incluses dans l'interface et aucun code en double n'est nécessaire. De plus, les méthodes sont disponibles dans chacun des cours !
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Que se passe-t-il s'il y a 100 classes avec une méthode gas(), mais que seulement 99 d'entre elles ont le même comportement ? Cela gâche tout, et la méthode par défaut ne fonctionnera pas dans ce cas ? Bien sûr que non :) Les méthodes par défaut des interfaces peuvent être remplacées.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Tous les 99 autres types de machines implémenteront la méthode par défaut, et la classe UnusualCar- l'exception - ne gâchera pas l'image globale et déterminera sereinement son comportement. Héritage multiple dans les interfaces Comme vous le savez déjà, il n'y a pas d'héritage multiple en Java. Il y a plusieurs raisons à cela, nous les examinerons en détail dans une conférence séparée. Dans d’autres langages, par exemple en C++, c’est l’inverse. Sans héritage multiple, un problème sérieux se pose : le même objet peut avoir un certain nombre de caractéristiques et de « comportements » différents. Un exemple tiré de la vie : pour nos parents nous sommes des enfants, pour les enseignants nous sommes des étudiants, pour les médecins nous sommes des patients. Dans la vie, nous jouons des rôles différents et, par conséquent, nous nous comportons différemment : nous parlerons évidemment différemment aux enseignants qu'à nos amis proches. Essayons de traduire cette situation en code. Imaginons que nous ayons deux classes : Pond et Aviary. Pour un étang, vous avez besoin d'oiseaux nageurs, et pour une volière, vous avez besoin d'oiseaux volants. Pour ce faire, nous avons créé deux classes de base - FlyingBirdet Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
En conséquence, nous enverrons à la volière les oiseaux dont les classes sont héritées de FlyingBird, et à l'étang - ceux qui descendent de Waterfowl. Tout semble simple. Mais que ferons-nous si nous devons identifier le canard quelque part ? Elle nage et vole. Mais nous n'avons pas d'héritage multiple. Heureusement, Java propose plusieurs implémentations d'interfaces. Si une classe ne peut pas hériter de plusieurs parents, implémenter plusieurs interfaces est simple ! Notre canard peut à la fois voler et nager :) Il suffit d'utiliser des interfaces FlyingBirdplutôt Waterfowlque des classes pour obtenir le résultat souhaité.
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Grâce à cela, notre programme conserve une gestion de classe flexible, et en combinaison avec l'implémentation de méthodes par défaut, notre capacité à définir le comportement des objets devient presque illimitée ! :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION