Historique de la question
L'opérateur instanceof a été introduit en Java pour permettre de vérifier si un objet appartient à un certain type (classe ou interface) avant de procéder à un transtypage. Cela est devenu pertinent pour travailler avec l'héritage, le polymorphisme et le traitement des collections hétérogènes d'objets.
Problème
Sans vérification d'appartenance au type, on peut obtenir une ClassCastException lors du transtypage. Une utilisation incorrecte de instanceof peut dégrader l'architecture du code, conduisant à des anti-patterns (par exemple, son utilisation fréquente à la place du polymorphisme).
Solution
L'opérateur instanceof retourne true si l'objet n'est pas null et appartient au type vérifié ou implémente l'interface spécifiée.
Exemple de code :
Object obj = "Hello"; if (obj instanceof String) { String str = (String) obj; System.out.println(str.toUpperCase()); }
Caractéristiques clés :
Que renverra obj instanceof SomeClass si obj == null ?
instanceof retourne toujours false si l'objet est null, peu importe le type vérifié. C'est important pour éviter les NullPointerException.
Peut-on utiliser instanceof pour vérifier l'appartenance à une interface ?
Oui. instanceof est utilisé pour vérifier si un objet implémente l'interface nécessaire, et non seulement pour vérifier l'appartenance à une certaine classe.
Exemple de code :
Runnable r = () -> {}; System.out.println(r instanceof Runnable); // true
Que se passe-t-il si la classe est compilée avec --release 16+ et que le pattern matching pour instanceof est déjà implémenté ?
Depuis Java 16+, l'opérateur instanceof prend en charge le pattern matching, ce qui permet d'indiquer immédiatement une variable dans la vérification et d'éviter le transtypage explicite.
Exemple de code :
Object obj = "Test string"; if (obj instanceof String str) { System.out.println(str.length()); }
Dans un grand projet, la logique de traitement commercial était construite sur une série de if (obj instanceof X)..., et non par le biais de la redéfinition des méthodes. Cela a compliqué la maintenance : l'apparition d'un nouveau type nécessitait de modifier toutes les vérifications.
Avantages :
Inconvénients :
Dans un projet similaire, pour une hiérarchie extensible, des méthodes abstraites étaient utilisées, et instanceof uniquement pour vérifier des cas particuliers.
Avantages :
Inconvénients :