Determina se un oggetto è di tipo primitivo

1. Panoramica

A volte è necessario determinare se un oggetto è di tipo primitivo, specialmente per i tipi primitivi wrapper. Tuttavia, non esistono metodi incorporati nel JDK standard per ottenere questo risultato.

In questo rapido tutorial, vedremo come implementare una soluzione utilizzando Java core. Quindi daremo un'occhiata a come possiamo ottenere questo risultato utilizzando un paio di librerie di uso comune.

2. Primitive e classi wrapper

Esistono nove oggetti predefiniti per rappresentare otto primitive e un tipo void in Java. Ogni tipo primitivo ha una classe wrapper corrispondente.

Per ulteriori informazioni su primitive e oggetti , vedere questo articolo.

Il java.lang.Class . Il metodo isPrimitive () può determinare se l'oggetto specificato rappresenta un tipo primitivo. Tuttavia, non funziona sui wrapper per le primitive.

Ad esempio, la seguente istruzione restituisce false :

Integer.class.isPrimitive(); 

Ora diamo un'occhiata ai diversi modi in cui possiamo ottenere questo risultato.

3. Utilizzo di Core Java

Per prima cosa, definiamo una variabile HashMap che memorizza il wrapper e le classi di tipo primitivo:

private static final Map
    
      WRAPPER_TYPE_MAP; static { WRAPPER_TYPE_MAP = new 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); }
     
    

Se l'oggetto è una classe wrapper primitiva, possiamo cercarlo dalla variabile HashMap predefinita con il metodo java.utils.Map.ContainsKey () .

Ora possiamo creare un semplice metodo di utilità per determinare se l'origine dell'oggetto è di un tipo primitivo:

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

Verifichiamo che funzioni come previsto:

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

4. Utilizzo di Apache Commons - ClassUtils. isPrimitiveOrWrapper ()

Apache Commons Lang ha un ClassUtils . isPrimitiveOrWrapper che può essere utilizzato per determinare se una classe è una primitiva o un wrapper di primitiva .

Per prima cosa, aggiungiamo la dipendenza commons-lang3 da Maven Central al nostro pom.xml :

 org.apache.commons commons-lang3 3.5 

Quindi proviamolo:

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

5. Utilizzo di Guava - Primitives. isWrapperType ()

Guava fornisce un'implementazione simile tramite il metodo Primitives.isWrapperType .

Ancora una volta, aggiungiamo prima la dipendenza da Maven Central:

 com.google.guava guava 29.0-jre 

Allo stesso modo, possiamo testarlo usando:

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

Tuttavia, il metodo Primitives.isWrapperType non funzionerà sulla classe primitiva, il codice seguente restituirà false:

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

6. Conclusione

In questo tutorial, abbiamo illustrato come determinare se un oggetto può rappresentare un tipo di dati primitivo utilizzando la nostra implementazione utilizzando Java. Quindi abbiamo esaminato un paio di librerie popolari che forniscono metodi di utilità per raggiungere questo obiettivo.

Il codice completo può essere trovato su Github.