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.
Utiliser 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.
Ouvrez l'éditeur WebIDE.
Dans l'explorateur de fichiers à gauche, assurez-vous d'être dans le répertoire
~/project.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 tapantPrintable.java.Ouvrez
Printable.javaet ajoutez le code suivant :package project; public interface Printable { void print(); }Cela définit une interface simple nommée
Printableavec une méthode,print().Enregistrez le fichier (Ctrl+S ou Cmd+S).
Maintenant, créons une classe qui implémente l'interface Printable.
Dans le répertoire
~/project, créez un nouveau fichier nomméDocument.java.Ouvrez
Document.javaet 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
Documentimplémente l'interfacePrintableet fournit une implémentation pour la méthodeprint().Enregistrez le fichier.
Enfin, créons une classe principale pour démontrer l'utilisation de instanceof avec l'interface.
Dans le répertoire
~/project, créez un nouveau fichier nomméInterfaceCheck.java.Ouvrez
InterfaceCheck.javaet 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,obj1qui fait référence à un objetDocument(qui implémentePrintable), etobj2qui fait référence à un objetString(qui n'implémente pasPrintable). - Nous utilisons
if (obj1 instanceof Printable)pour vérifier si l'objet référencé parobj1est une instance de l'interfacePrintable. - Si c'est le cas, nous affichons un message puis nous castons
obj1au typePrintableen utilisant(Printable) obj1. Le casting nous permet de traiter l'objetObjectcomme un objetPrintableet d'appeler sa méthodeprint(). - Nous effectuons la même vérification pour
obj2. CommeStringn'implémente pasPrintable, le blocelsesera exécuté.
- Nous créons deux variables de type
Enregistrez le fichier.
Maintenant, compilons et exécutons le code.
Ouvrez le terminal en bas de l'éditeur WebIDE. Assurez-vous d'être dans le répertoire
~/project.Compilez les fichiers Java :
javac Printable.java Document.java InterfaceCheck.javaS'il n'y a pas d'erreurs, cette commande créera les fichiers
Printable.class,Document.classetInterfaceCheck.class.Exécutez le programme
InterfaceCheck:java InterfaceCheckVous 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.
Ouvrez l'éditeur WebIDE.
Dans le répertoire
~/project, créez un nouveau fichier nomméEditable.java.Ouvrez
Editable.javaet ajoutez le code suivant :package project; public interface Editable { void edit(String newContent); }Cela définit une interface nommée
Editableavec une méthode,edit().Enregistrez le fichier.
Maintenant, modifions notre classe Document pour qu'elle implémente à la fois Printable et Editable.
Ouvrez le fichier
Document.javadans le répertoire~/project.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éthodeedit().Enregistrez le fichier.
Ensuite, modifions notre classe principale InterfaceCheck.java pour tester les deux interfaces.
Ouvrez le fichier
InterfaceCheck.javadans le répertoire~/project.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
obj1est une instance à la fois dePrintableet deEditable. CommeDocumentimplémente les deux interfaces, les deux conditionsifpourobj1seront vraies. Nous démontrons également l'appel de la méthodeedit()après avoir effectué un cast versEditable. Pourobj2(la chaîne de caractèresString), les deux vérifications seront fausses.Enregistrez le fichier.
Enfin, compilez et exécutez le code mis à jour.
Ouvrez le terminal dans le répertoire
~/project.Compilez à nouveau les fichiers Java :
javac Printable.java Editable.java Document.java InterfaceCheck.javaExécutez le programme
InterfaceCheck:java InterfaceCheckVous 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.
Ouvrez le fichier
InterfaceCheck.javadans le répertoire~/project.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:obj3est affectée ànull.obj4est affectée à une nouvelle instance de la classe de baseObject, qui n'implémente pas nos interfaces personnalisées.
Nous utilisons ensuite
instanceofpour vérifier chacun de ces objets par rapport aux interfacesPrintableetEditable.Enregistrez le fichier.
Maintenant, compilons et exécutons le code mis à jour.
Ouvrez le terminal dans le répertoire
~/project.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.javaExécutez le programme
InterfaceCheck:java InterfaceCheckVous 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.



