Déterminer si un objet est de type primitif

1. Vue d'ensemble

Parfois, nous devons déterminer si un objet est de type primitif, en particulier pour les types primitifs wrapper. Cependant, il n'existe aucune méthode intégrée dans le JDK standard pour y parvenir.

Dans ce rapide tutoriel, nous verrons comment implémenter une solution à l'aide de Java Core. Ensuite, nous verrons comment nous pouvons y parvenir en utilisant quelques bibliothèques couramment utilisées.

2. Primitives et classes de wrapper

Il existe neuf objets prédéfinis pour représenter huit primitives et un type vide en Java. Chaque type primitif a une classe Wrapper correspondante.

Pour en savoir plus sur les primitifs et les objets , veuillez consulter cet article.

Le fichier java.lang.Class . La méthode isPrimitive () peut déterminer si l'objet spécifié représente un type primitif. Cependant, cela ne fonctionne pas sur les wrappers pour les primitives.

Par exemple, l'instruction suivante renvoie false :

Integer.class.isPrimitive(); 

Jetons maintenant un coup d'œil aux différentes façons d'y parvenir.

3. Utilisation de Core Java

Tout d'abord, définissons une variable HashMap qui stocke le wrapper et les classes de types primitifs:

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); }
     
    

Si l'objet est une classe wrapper primitive, nous pouvons le rechercher à partir de la variable HashMap prédéfinie avec la méthode java.utils.Map.ContainsKey () .

Nous pouvons maintenant créer une méthode utilitaire simple pour déterminer si la source de l'objet est de type primitif:

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

Vérifions que cela fonctionne comme prévu:

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

4. Utilisation d'Apache Commons - ClassUtils. isPrimitiveOrWrapper ()

Apache Commons Lang a un ClassUtils . isPrimitiveOrWrapper méthode qui peut être utilisée pour déterminer si une classe est une primitive ou un wrapper de primitive .

Tout d'abord, ajoutons la dépendance commons-lang3 de Maven Central à notre pom.xml :

 org.apache.commons commons-lang3 3.5 

Alors testons-le:

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

5. Utilisation de la goyave - Primitives. isWrapperType ()

Guava fournit une implémentation similaire via la méthode Primitives.isWrapperType .

Encore une fois, ajoutons d'abord la dépendance de Maven Central:

 com.google.guava guava 29.0-jre 

De même, nous pouvons le tester en utilisant:

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

Cependant, la méthode Primitives.isWrapperType ne fonctionnera pas sur la classe primitive, le code suivant retournera false:

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

6. Conclusion

Dans ce didacticiel, nous avons illustré comment déterminer si un objet peut représenter un type de données primitif à l'aide de notre propre implémentation à l'aide de Java. Ensuite, nous avons jeté un coup d'œil à quelques bibliothèques populaires qui fournissent des méthodes utilitaires pour y parvenir.

Le code complet est disponible sur Github.