Bestem om et objekt er av primitiv type

1. Oversikt

Noen ganger må vi avgjøre om et objekt er av primitiv type, spesielt for primitive typer wrapper. Imidlertid er det ingen innebygde metoder i standard JDK for å oppnå dette.

I denne raske opplæringen vil vi se hvordan du implementerer en løsning ved hjelp av kjernen i Java. Deretter tar vi en titt på hvordan vi kan oppnå dette ved hjelp av et par vanlige biblioteker.

2. Primitiver og innpakningsklasser

Det er ni forhåndsdefinerte objekter som skal representere åtte primitiver og a tomrom skriv inn Java. Hver primitive type har en tilsvarende innpakningsklasse.

For å lære mer om Primitiver og Gjenstands, se denne artikkelen.

De java.lang.Klasse.erPrimitive () metoden kan avgjøre om det spesifiserte objektet representerer en primitiv type. Imidlertid fungerer det ikke på innpakningene for primitiver.

For eksempel returnerer følgende utsagn falsk:

Integer.class.isPrimitive (); 

La oss nå se på forskjellige måter vi kan oppnå dette på.

3. Bruke Core Java

La oss først definere en HashMap variabel som lagrer innpakningen og de primitive typeklassene:

privat statisk endelig Kart WRAPPER_TYPE_MAP; statisk {WRAPPER_TYPE_MAP = nytt HashMap(16); WRAPPER_TYPE_MAP.put (Integer.class, int.class); WRAPPER_TYPE_MAP.put (Byte.klasse, byte.klasse); WRAPPER_TYPE_MAP.put (Character.class, char.class); WRAPPER_TYPE_MAP.put (boolsk.klasse, boolsk.klasse); 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 (kort.klasse, kort.klasse); WRAPPER_TYPE_MAP.put (Void.class, void.class); }

Hvis objektet er en primitiv innpakningsklasse, kan vi slå det opp fra det forhåndsdefinerte HashMap variabel med java.utils.Map.ContainsKey () metode.

Nå kan vi lage en enkel verktøymetode for å bestemme om objektkilden er av en primitiv type:

public static boolean isPrimitiveType (Object source) {return WRAPPER_TYPE_MAP.containsKey (source.getClass ()); }

La oss validere at dette fungerer som forventet:

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

4. Bruke Apache Commons - ClassUtils.isPrimitiveOrWrapper ()

Apache Commons Lang har en ClassUtils.erPrimitiveOrWrapper metode som kan brukes til å bestemme om en klasse er en primitiv eller en innpakning av primitiv.

La oss først legge til commons-lang3 avhengighet fra Maven Central til vår pom.xml:

 org.apache.commons commons-lang3 3.5 

Så la oss teste det:

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

5. Bruke Guava - Primitiver.isWrapperType ()

Guava gir en lignende implementering via Primitives.isWrapperType metode.

Igjen, la oss først legge til avhengigheten fra Maven Central:

 com.google.guava guava 29.0-jre 

På samme måte kan vi teste det ved hjelp av:

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

Imidlertid, den Primitives.isWrapperType metoden vil ikke fungere på den primitive klassen, følgende kode vil returnere falsk:

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

6. Konklusjon

I denne opplæringen illustrerte vi hvordan vi kan avgjøre om et objekt kan representere en primitiv datatype ved hjelp av vår egen implementering ved hjelp av Java. Så tok vi en titt på et par populære biblioteker som gir verktøy for å oppnå dette.

Den komplette koden finner du på Github.