Achtergrond:
Het sleutelwoord instanceof is in Java geïntroduceerd om te controleren of een object behoort tot een bepaald type of een subtype ervan. Dit mechanisme maakt het mogelijk om tijdens runtime het type van een object te verfijnen, wat belangrijk is voor het werken met generieke collecties, polymorfisme en type-omzetting.
Probleem:
Zonder de juiste typebepaling van een object kunnen fouten zoals ClassCastException of onjuiste logica in de codebranches optreden wanneer type-omzetting plaatsvindt zonder controle. Bovendien is overmatig gebruik van instanceof vaak een teken van slecht ontwerp.
Oplossing:
instanceof retourneert true als het object een instantie is van de gegeven klasse of een van zijn subklassen, of als het een interface implementeert. In Java 16 werd patroonmatching geïntroduceerd met automatische type-omzetting binnen een if-blok.
Voorbeeldcode:
Object obj = "Hallo!"; if (obj instanceof String) { String s = (String) obj; // Omzetting is veilig System.out.println(s.length()); }
Met Java 16:
if (obj instanceof String s) { System.out.println(s.length()); // s wordt automatisch omgezet naar String }
Belangrijkste kenmerken:
null instanceof Type is altijd false)Wat retourneert null instanceof SomeClass?
Altijd false. De operator garandeert dat als het object null is, de uitkomst false is, waardoor een NullPointerException wordt uitgesloten.
Kan instanceof worden gebruikt met generiek parameters, bijvoorbeeld if (obj instanceof List<String>)?
Nee. Door type-erasure kan men generieke parameters niet tijdens runtime controleren. Controle gebeurt altijd alleen op de raw-type (bijvoorbeeld, List).
Voorbeeldcode:
List<String> list = ...; if (list instanceof List<String>) { ... } // Compilatiefout if (list instanceof List) { ... } // Toegestaan
Kan het gebruik van instanceof wijzen op problemen in de codeontwerp?
Ja. Voortdurend gebruik van instanceof in plaats van het toepassen van abstracties of patronen (bijvoorbeeld het Visitor-patroon) duidt vaak op een schending van OOP-principes, zoals open/geslotenheid.
In de methode is er een lange keten van if-else-structuren met controle op alle mogelijke subklassen van één superklasse via instanceof, waarbij binnen elke tak type-omzetting en aanroep van de overeenkomstige methode plaatsvindt.
Voordelen:
Nadelen:
In plaats van if-else is het Visitor-patroon geïmplementeerd: elke subklasse heeft een methode die het gewenste gedrag oproept, waardoor instanceof vermeden wordt.
Voordelen:
Nadelen: