Определете дали даден обект е от примитивен тип

1. Общ преглед

Понякога трябва да определим дали даден обект е от примитивен тип, особено за примитивните типове обвивки. В стандартния JDK обаче няма вградени методи за постигане на това.

В този бърз урок ще видим как да внедрим решение с помощта на основната Java. След това ще разгледаме как можем да постигнем това, като използваме няколко често използвани библиотеки.

2. Класове примитиви и обвивки

Има девет предварително дефинирани обекта, които представляват осем примитива и тип void в Java. Всеки примитивен тип има съответния клас Wrapper.

За да научите повече за примитиви и обекти , моля, вижте тази статия.

Класът java.lang.Class . Методът isPrimitive () може да определи дали посоченият обект представлява примитивен тип. Не работи обаче върху обвивките за примитиви.

Например следният оператор връща false :

Integer.class.isPrimitive(); 

Сега нека разгледаме различните начини, по които можем да постигнем това.

3. Използване на Core Java

Първо, нека дефинираме променлива HashMap, която съхранява обвивката и примитивните класове тип:

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

Ако обектът е примитивен клас обвивка, можем да го потърсим от предварително дефинираната променлива HashMap с метод java.utils.Map.ContainsKey () .

Сега можем да създадем прост полезен метод, за да определим дали източникът на обекта е от примитивен тип:

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

Нека потвърдим, че това работи както се очаква:

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

4. Използване на Apache Commons - ClassUtils. isPrimitiveOrWrapper ()

Apache Commons Lang има ClassUtils . isPrimitiveOrWrapper метод, който може да се използва за определяне дали даден клас е примитив или обвивка на примитив .

Първо, нека добавим зависимостта commons-lang3 от Maven Central към нашия pom.xml :

 org.apache.commons commons-lang3 3.5 

Тогава нека го тестваме:

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

5. Използване на гуава - примитиви. isWrapperType ()

Guava осигурява подобна реализация чрез метода Primitive.isWrapperType .

Отново нека първо добавим зависимостта от Maven Central:

 com.google.guava guava 29.0-jre 

По същия начин можем да го тестваме с помощта на:

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

Обаче методът Primitive.isWrapperType няма да работи за примитивния клас, следният код ще върне false:

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

6. Заключение

В този урок ние илюстрирахме как да определим дали даден обект може да представлява примитивен тип данни, използвайки нашето собствено внедряване с Java. След това разгледахме няколко популярни библиотеки, които предоставят полезни методи за постигане на това.

Пълният код може да бъде намерен в Github.