Bepaal of een object van primitief type is

1. Overzicht

Soms moeten we bepalen of een object van een primitief type is, vooral voor primitieve typen wrapper. Er zijn echter geen ingebouwde methoden in de standaard JDK om dit te bereiken.

In deze korte tutorial zullen we zien hoe u een oplossing implementeert met behulp van core Java. Vervolgens bekijken we hoe we dit kunnen bereiken met behulp van een aantal veelgebruikte bibliotheken.

2. Primitieven en wrapper-klassen

Er zijn negen vooraf gedefinieerde objecten om acht primitieven en een leegte typ Java. Elk primitief type heeft een bijbehorende Wrapper-klasse.

Om meer te weten te komen over Primitieven en Voorwerps, zie dit artikel.

De java.lang.Class.isPrimitive () methode kan bepalen of het opgegeven object een primitief type vertegenwoordigt. Het werkt echter niet op de wrappers voor primitieven.

De volgende instructie retourneert bijvoorbeeld false:

Integer.class.isPrimitive (); 

Laten we nu eens kijken naar verschillende manieren waarop we dit kunnen bereiken.

3. Core Java gebruiken

Laten we eerst een Hash kaart variabele die de wrapper en de primitieve typeklassen opslaat:

privé statische definitieve kaart WRAPPER_TYPE_MAP; statisch {WRAPPER_TYPE_MAP = nieuwe HashMap(16); WRAPPER_TYPE_MAP.put (Integer.class, int.class); WRAPPER_TYPE_MAP.put (Byte.class, byte.class); WRAPPER_TYPE_MAP.put (Character.class, char.class); WRAPPER_TYPE_MAP.put (Boolean.class, boolean.class); WRAPPER_TYPE_MAP.put (Double.class, double.class); WRAPPER_TYPE_MAP.put (Float.class, float.class); WRAPPER_TYPE_MAP.put (Long.class, long.class); WRAPPER_TYPE_MAP.put (Short.class, short.class); WRAPPER_TYPE_MAP.put (Void.class, void.class); }

Als het object een primitieve wrapper-klasse is, kunnen we het opzoeken vanuit het vooraf gedefinieerde Hash kaart variabel met java.utils.Map.ContainsKey () methode.

Nu kunnen we een eenvoudige hulpprogramma-methode maken om te bepalen of de objectbron van een primitief type is:

openbare statische boolean isPrimitiveType (objectbron) {return WRAPPER_TYPE_MAP.containsKey (source.getClass ()); }

Laten we valideren dat dit werkt zoals verwacht:

assertTrue (PrimitiveTypeUtil.isPrimitiveType (false)); assertTrue (PrimitiveTypeUtil.isPrimitiveType (1L)); assertFalse (PrimitiveTypeUtil.isPrimitiveType (StringUtils.EMPTY));

4. Apache Commons gebruiken - ClassUtils.isPrimitiveOrWrapper ()

Apache Commons Lang heeft een ClassUtils.isPrimitiveOrWrapper methode die kan worden gebruikt om te bepalen of een klasse een primitief is of een omhulsel van primitief.

Laten we eerst het commons-lang3 afhankelijkheid van Maven Central naar onze pom.xml:

 org.apache.commons commons-lang3 3.5 

Laten we het dan testen:

assertTrue (ClassUtils.isPrimitiveOrWrapper (Boolean.False.getClass ())); assertTrue (ClassUtils.isPrimitiveOrWrapper (boolean.class)); assertFalse (ClassUtils.isPrimitiveOrWrapper (StringUtils.EMPTY.getClass ()));

5. Guava gebruiken - Primitieven.isWrapperType ()

Guava biedt een vergelijkbare implementatie via de Primitives.isWrapperType methode.

Nogmaals, laten we eerst de afhankelijkheid van Maven Central toevoegen:

 com.google.guava guave 29.0-jre 

Evenzo kunnen we het testen met behulp van:

assertTrue (Primitives.isWrapperType (Boolean.FALSE.getClass ())); assertFalse (Primitives.isWrapperType (StringUtils.EMPTY.getClass ()));

echter, de Primitives.isWrapperType methode werkt niet op de primitieve klasse, de volgende code retourneert false:

assertFalse (Primitives.isWrapperType (boolean.class));

6. Conclusie

In deze zelfstudie hebben we geïllustreerd hoe we kunnen bepalen of een object een primitief gegevenstype kan vertegenwoordigen met behulp van onze eigen implementatie met behulp van Java. Vervolgens hebben we een aantal populaire bibliotheken bekeken die hulpprogramma's bieden om dit te bereiken.

De volledige code is te vinden op Github.