Comment vérifier si un objet implémente une interface en Java

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous apprendrez à vérifier si un objet implémente une interface spécifique en Java. Nous allons explorer l'utilisation du mot-clé instanceof, un outil fondamental pour la vérification du type à l'exécution.

Grâce à des exercices pratiques, vous utiliserez le mot-clé instanceof pour vérifier l'implémentation d'une interface, tester des scénarios impliquant plusieurs interfaces et gérer les cas d'objets nuls ou qui n'implémentent pas l'interface. Ce laboratoire vous offrira des compétences pratiques pour déterminer le type réel d'un objet et exploiter les fonctionnalités spécifiques à l'interface.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/oop("OOP") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/interface("Interface") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/if_else -.-> lab-560009{{"Comment vérifier si un objet implémente une interface en Java"}} java/classes_objects -.-> lab-560009{{"Comment vérifier si un objet implémente une interface en Java"}} java/oop -.-> lab-560009{{"Comment vérifier si un objet implémente une interface en Java"}} java/interface -.-> lab-560009{{"Comment vérifier si un objet implémente une interface en Java"}} java/object_methods -.-> lab-560009{{"Comment vérifier si un objet implémente une interface en Java"}} end

Appliquer instanceof pour vérifier une interface

Dans cette étape, nous allons explorer comment utiliser le mot-clé instanceof en Java pour vérifier si un objet est une instance d'une interface spécifique. C'est une tâche courante lorsque vous avez une variable de type classe mère ou d'interface et que vous devez déterminer le type réel de l'objet auquel elle fait référence, notamment si vous souhaitez appeler des méthodes spécifiques à une interface particulière.

Tout d'abord, définissons une interface simple et une classe qui l'implémente.

  1. Ouvrez l'éditeur WebIDE.

  2. Dans l'explorateur de fichiers à gauche, assurez-vous d'être dans le répertoire ~/project.

  3. Créez un nouveau fichier nommé Printable.java. Vous pouvez le faire en cliquant avec le bouton droit dans l'explorateur de fichiers et en sélectionnant "Nouveau fichier", puis en tapant Printable.java.

  4. Ouvrez Printable.java et ajoutez le code suivant :

    package project;
    
    public interface Printable {
        void print();
    }

    Cela définit une interface simple nommée Printable avec une méthode, print().

  5. Enregistrez le fichier (Ctrl+S ou Cmd+S).

Maintenant, créons une classe qui implémente l'interface Printable.

  1. Dans le répertoire ~/project, créez un nouveau fichier nommé Document.java.

  2. Ouvrez Document.java et ajoutez le code suivant :

    package project;
    
    public class Document implements Printable {
        private String content;
    
        public Document(String content) {
            this.content = content;
        }
    
        @Override
        public void print() {
            System.out.println("Printing Document: " + content);
        }
    }

    Cette classe Document implémente l'interface Printable et fournit une implémentation pour la méthode print().

  3. Enregistrez le fichier.

Enfin, créons une classe principale pour démontrer l'utilisation de instanceof avec l'interface.

  1. Dans le répertoire ~/project, créez un nouveau fichier nommé InterfaceCheck.java.

  2. Ouvrez InterfaceCheck.java et ajoutez le code suivant :

    package project;
    
    public class InterfaceCheck {
        public static void main(String[] args) {
            Object obj1 = new Document("Important Report");
            Object obj2 = "Just a String";
    
            // Check if obj1 is an instance of Printable
            if (obj1 instanceof Printable) {
                System.out.println("obj1 implements Printable");
                Printable p1 = (Printable) obj1; // Cast to Printable
                p1.print(); // Call the print method
            } else {
                System.out.println("obj1 does not implement Printable");
            }
    
            System.out.println("---");
    
            // Check if obj2 is an instance of Printable
            if (obj2 instanceof Printable) {
                System.out.println("obj2 implements Printable");
                Printable p2 = (Printable) obj2; // This line would cause a ClassCastException if executed
                p2.print();
            } else {
                System.out.println("obj2 does not implement Printable");
            }
        }
    }

    Dans ce code :

    • Nous créons deux variables de type Object, obj1 qui fait référence à un objet Document (qui implémente Printable), et obj2 qui fait référence à un objet String (qui n'implémente pas Printable).
    • Nous utilisons if (obj1 instanceof Printable) pour vérifier si l'objet référencé par obj1 est une instance de l'interface Printable.
    • Si c'est le cas, nous affichons un message puis nous castons obj1 au type Printable en utilisant (Printable) obj1. Le casting nous permet de traiter l'objet Object comme un objet Printable et d'appeler sa méthode print().
    • Nous effectuons la même vérification pour obj2. Comme String n'implémente pas Printable, le bloc else sera exécuté.
  3. Enregistrez le fichier.

Maintenant, compilons et exécutons le code.

  1. Ouvrez le terminal en bas de l'éditeur WebIDE. Assurez-vous d'être dans le répertoire ~/project.

  2. Compilez les fichiers Java :

    javac Printable.java Document.java InterfaceCheck.java

    S'il n'y a pas d'erreurs, cette commande créera les fichiers Printable.class, Document.class et InterfaceCheck.class.

  3. Exécutez le programme InterfaceCheck :

    java InterfaceCheck

    Vous devriez voir une sortie similaire à ceci :

    obj1 implements Printable
    Printing Document: Important Report
    ---
    obj2 does not implement Printable

Cette sortie confirme que instanceof a correctement identifié que obj1 implémente Printable tandis que obj2 ne l'implémente pas. L'utilisation de instanceof avant le casting est cruciale pour éviter les erreurs ClassCastException à l'exécution.

Tester avec plusieurs interfaces

Dans cette étape, nous allons approfondir notre compréhension de instanceof en travaillant avec plusieurs interfaces. Une seule classe en Java peut implémenter plusieurs interfaces, et instanceof peut être utilisé pour vérifier chacune d'elles.

Tout d'abord, définissons une autre interface.

  1. Ouvrez l'éditeur WebIDE.

  2. Dans le répertoire ~/project, créez un nouveau fichier nommé Editable.java.

  3. Ouvrez Editable.java et ajoutez le code suivant :

    package project;
    
    public interface Editable {
        void edit(String newContent);
    }

    Cela définit une interface nommée Editable avec une méthode, edit().

  4. Enregistrez le fichier.

Maintenant, modifions notre classe Document pour qu'elle implémente à la fois Printable et Editable.

  1. Ouvrez le fichier Document.java dans le répertoire ~/project.

  2. Modifiez la déclaration de la classe pour qu'elle implémente les deux interfaces :

    package project;
    
    public class Document implements Printable, Editable {
        private String content;
    
        public Document(String content) {
            this.content = content;
        }
    
        @Override
        public void print() {
            System.out.println("Printing Document: " + content);
        }
    
        @Override
        public void edit(String newContent) {
            this.content = newContent;
            System.out.println("Document edited.");
        }
    }

    Nous avons ajouté , Editable à la déclaration de la classe et fourni une implémentation pour la méthode edit().

  3. Enregistrez le fichier.

Ensuite, modifions notre classe principale InterfaceCheck.java pour tester les deux interfaces.

  1. Ouvrez le fichier InterfaceCheck.java dans le répertoire ~/project.

  2. Remplacez le code existant par le suivant :

    package project;
    
    public class InterfaceCheck {
        public static void main(String[] args) {
            Object obj1 = new Document("Initial Content");
            Object obj2 = "Just a String";
    
            System.out.println("Checking obj1:");
            // Check if obj1 is an instance of Printable
            if (obj1 instanceof Printable) {
                System.out.println("obj1 implements Printable");
                Printable p1 = (Printable) obj1;
                p1.print();
            } else {
                System.out.println("obj1 does not implement Printable");
            }
    
            // Check if obj1 is an instance of Editable
            if (obj1 instanceof Editable) {
                System.out.println("obj1 implements Editable");
                Editable e1 = (Editable) obj1; // Cast to Editable
                e1.edit("Modified Content"); // Call the edit method
                // After editing, let's print again to see the change
                if (obj1 instanceof Printable) { // We know it is, but demonstrating
                    Printable p1_after_edit = (Printable) obj1;
                    p1_after_edit.print();
                }
            } else {
                System.out.println("obj1 does not implement Editable");
            }
    
            System.out.println("---");
    
            System.out.println("Checking obj2:");
            // Check if obj2 is an instance of Printable
            if (obj2 instanceof Printable) {
                System.out.println("obj2 implements Printable");
                // Printable p2 = (Printable) obj2; // Would cause ClassCastException
                // p2.print();
            } else {
                System.out.println("obj2 does not implement Printable");
            }
    
            // Check if obj2 is an instance of Editable
            if (obj2 instanceof Editable) {
                System.out.println("obj2 implements Editable");
                // Editable e2 = (Editable) obj2; // Would cause ClassCastException
                // e2.edit("Some Content");
            } else {
                System.out.println("obj2 does not implement Editable");
            }
        }
    }

    Dans ce code mis à jour, nous vérifions maintenant si obj1 est une instance à la fois de Printable et de Editable. Comme Document implémente les deux interfaces, les deux conditions if pour obj1 seront vraies. Nous démontrons également l'appel de la méthode edit() après avoir effectué un cast vers Editable. Pour obj2 (la chaîne de caractères String), les deux vérifications seront fausses.

  3. Enregistrez le fichier.

Enfin, compilez et exécutez le code mis à jour.

  1. Ouvrez le terminal dans le répertoire ~/project.

  2. Compilez à nouveau les fichiers Java :

    javac Printable.java Editable.java Document.java InterfaceCheck.java
  3. Exécutez le programme InterfaceCheck :

    java InterfaceCheck

    Vous devriez voir une sortie similaire à ceci :

    Checking obj1:
    obj1 implements Printable
    Printing Document: Initial Content
    obj1 implements Editable
    Document edited.
    Printing Document: Modified Content
    ---
    Checking obj2:
    obj2 does not implement Printable
    obj2 does not implement Editable

Cette sortie montre que instanceof a correctement identifié que l'objet Document (obj1) implémente les deux interfaces, et nous avons pu effectuer des casts et appeler des méthodes à la fois de Printable et de Editable. L'objet String (obj2) a correctement indiqué qu'il n'implémente aucune des deux interfaces.

Gérer les objets nuls et les objets n'implémentant pas l'interface

Dans cette étape, nous allons examiner le comportement du mot-clé instanceof lorsqu'il est utilisé avec des références null et des objets qui n'implémentent pas l'interface vérifiée. Comprendre ces cas est essentiel pour écrire un code robuste.

Modifions le fichier InterfaceCheck.java pour inclure une référence null et un objet d'une classe qui n'implémente ni Printable ni Editable.

  1. Ouvrez le fichier InterfaceCheck.java dans le répertoire ~/project.

  2. Remplacez le code existant par le suivant :

    package project;
    
    // Assume Printable and Editable interfaces and Document class are already defined
    
    public class InterfaceCheck {
        public static void main(String[] args) {
            Object obj1 = new Document("Initial Content");
            Object obj2 = "Just a String"; // Does not implement Printable or Editable
            Object obj3 = null; // A null reference
            Object obj4 = new Object(); // An object that does not implement Printable or Editable
    
            System.out.println("Checking obj1 (Document):");
            if (obj1 instanceof Printable) {
                System.out.println("obj1 implements Printable");
            } else {
                System.out.println("obj1 does not implement Printable");
            }
            if (obj1 instanceof Editable) {
                System.out.println("obj1 implements Editable");
            } else {
                System.out.println("obj1 does not implement Editable");
            }
    
            System.out.println("---");
    
            System.out.println("Checking obj2 (String):");
            if (obj2 instanceof Printable) {
                System.out.println("obj2 implements Printable");
            } else {
                System.out.println("obj2 does not implement Printable");
            }
            if (obj2 instanceof Editable) {
                System.out.println("obj2 implements Editable");
            } else {
                System.out.println("obj2 does not implement Editable");
            }
    
            System.out.println("---");
    
            System.out.println("Checking obj3 (null):");
            if (obj3 instanceof Printable) {
                System.out.println("obj3 implements Printable");
            } else {
                System.out.println("obj3 does not implement Printable");
            }
            if (obj3 instanceof Editable) {
                System.out.println("obj3 implements Editable");
            } else {
                System.out.println("obj3 does not implement Editable");
            }
    
            System.out.println("---");
    
            System.out.println("Checking obj4 (Object):");
            if (obj4 instanceof Printable) {
                System.out.println("obj4 implements Printable");
            } else {
                System.out.println("obj4 does not implement Printable");
            }
            if (obj4 instanceof Editable) {
                System.out.println("obj4 implements Editable");
            } else {
                System.out.println("obj4 does not implement Editable");
            }
        }
    }

    Dans ce code mis à jour, nous avons ajouté deux nouvelles variables de type Object :

    • obj3 est affectée à null.
    • obj4 est affectée à une nouvelle instance de la classe de base Object, qui n'implémente pas nos interfaces personnalisées.

    Nous utilisons ensuite instanceof pour vérifier chacun de ces objets par rapport aux interfaces Printable et Editable.

  3. Enregistrez le fichier.

Maintenant, compilons et exécutons le code mis à jour.

  1. Ouvrez le terminal dans le répertoire ~/project.

  2. Compilez les fichiers Java. Comme nous avons seulement modifié InterfaceCheck.java, nous pouvons compiler uniquement ce fichier, mais compiler les trois est également correct :

    javac Printable.java Editable.java Document.java InterfaceCheck.java
  3. Exécutez le programme InterfaceCheck :

    java InterfaceCheck

    Vous devriez voir une sortie similaire à ceci :

    Checking obj1 (Document):
    obj1 implements Printable
    obj1 implements Editable
    ---
    Checking obj2 (String):
    obj2 does not implement Printable
    obj2 does not implement Editable
    ---
    Checking obj3 (null):
    obj3 does not implement Printable
    obj3 does not implement Editable
    ---
    Checking obj4 (Object):
    obj4 does not implement Printable
    obj4 does not implement Editable

Observez la sortie pour obj3 (la référence null). L'opérateur instanceof retourne false lorsque la référence d'objet est null, quelle que soit le type vérifié. C'est un comportement clé de instanceof et évite les erreurs NullPointerException lors de la vérification.

Observez également la sortie pour obj4 (l'objet de type Object). Comme prévu, puisque la classe Object n'implémente ni Printable ni Editable, les vérifications instanceof retournent false.

Cette étape démontre que instanceof peut être utilisé en toute sécurité avec des références null et identifie correctement les objets qui n'implémentent pas l'interface spécifiée.

Résumé

Dans ce laboratoire, nous avons appris à vérifier si un objet implémente une interface spécifique en Java en utilisant le mot-clé instanceof. Nous avons commencé par définir une interface simple (Printable) et une classe (Document) qui l'implémente. Nous avons ensuite créé une classe principale (InterfaceCheck) pour démontrer comment utiliser instanceof pour vérifier si un objet est une instance de l'interface Printable. Cette technique fondamentale est essentielle pour effectuer des casts d'objets en toute sécurité et appeler des méthodes spécifiques à l'interface.

Nous avons ensuite exploré la flexibilité de instanceof en testant des objets qui implémentent plusieurs interfaces et en considérant également des cas limites tels que la gestion d'objets nuls et d'objets qui n'implémentent pas l'interface cible. Cette approche complète garantit une compréhension solide de la manière de déterminer de manière fiable le statut d'implémentation d'une interface d'un objet dans diverses situations.