Geschiedenis van de vraag
De instanceof-operator werd geïntroduceerd in Java om te controleren of een object tot een bepaald type (klasse of interface) behoort voordat het type wordt gecast. Dit werd relevant voor het werken met overerving, polymorfisme en de verwerking van heterogene objectverzamelingen.
Probleem
Zonder typecontrole kan een ClassCastException optreden tijdens het casten van types. Onjuist gebruik van instanceof kan de architectuur van de code verslechteren en leiden tot anti-patronen (bijvoorbeeld frequent gebruik in plaats van polymorfisme).
Oplossing
De instanceof-operator retourneert true als het object niet null is en behoort tot het gecontroleerde type of de opgegeven interface implementeert.
Voorbeeldcode:
Object obj = "Hallo"; if (obj instanceof String) { String str = (String) obj; System.out.println(str.toUpperCase()); }
Belangrijke kenmerken:
Wat retourneert obj instanceof SomeClass als obj == null?
instanceof retourneert altijd false als het object null is, ongeacht het gecontroleerde type. Dit is belangrijk om een NullPointerException te voorkomen.
Kan instanceof worden gebruikt om te controleren of aan een interface wordt voldaan?
Ja. instanceof wordt gebruikt om te controleren of een object de vereiste interface implementeert en niet alleen om te controleren of het tot een bepaalde klasse behoort.
Voorbeeldcode:
Runnable r = () -> {}; System.out.println(r instanceof Runnable); // true
Wat gebeurt er als de klasse wordt gecompileerd met --release 16+ en pattern matching voor instanceof al is geïmplementeerd?
Vanaf Java 16+ ondersteunt de instanceof-operator pattern matching, wat betekent dat je direct in de controle een variabele kunt opgeven en expliciete casting kunt vermijden.
Voorbeeldcode:
Object obj = "Test string"; if (obj instanceof String str) { System.out.println(str.length()); }
In een groot project is de logica van de bedrijfsverwerking gebouwd op een serie if (obj instanceof X)..., in plaats van via methodenoverschrijvingen. Dit bemoeilijkte het onderhoud: het verschijnen van een nieuw type vereist dat alle controles worden gewijzigd.
Voordelen:
Nadelen:
In een vergelijkbaar project werd voor een uitbreidbare hiërarchie gebruikgemaakt van abstracte methoden, en instanceof alleen voor het controleren van speciale edge-cases.
Voordelen:
Nadelen: