Перейти к основному содержимому

Определите, является ли объект примитивным типом

· 3 мин. чтения

1. Обзор

Иногда нам нужно определить, относится ли объект к примитивному типу, особенно для примитивных типов-оболочек. Однако в стандартном JDK нет встроенных методов для достижения этой цели.

В этом кратком руководстве мы увидим, как реализовать решение с использованием ядра Java. Затем мы рассмотрим, как мы можем добиться этого, используя пару часто используемых библиотек.

2. Примитивы и классы-оболочки

В Java есть девять предопределенных объектов для представления восьми примитивов и типа void . Каждый примитивный тип имеет соответствующий класс-оболочку .

Чтобы узнать больше о примитивах и объектах , см. эту статью .

Класс java.lang.Class . isPrimitive() может определить, представляет ли указанный объект примитивный тип. Однако это не работает с оболочками для примитивов.

Например, следующий оператор возвращает false :

Integer.class.isPrimitive();

Теперь давайте взглянем на различные способы, которыми мы можем этого добиться.

3. Использование ядра Java

Во-первых, давайте определим переменную HashMap , в которой хранятся классы-оболочки и примитивные типы:

private static final Map<Class<?>, Class<?>> WRAPPER_TYPE_MAP;
static {
WRAPPER_TYPE_MAP = new HashMap<Class<?>, Class<?>>(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 :

<dependency>
<groupId>org.apache.commons<groupId>
<artifactId>commons-lang3<artifactId>
<version>3.12.0<version>
<dependency>

Тогда давайте проверим это:

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

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

Guava предоставляет аналогичную реализацию с помощью метода Primitives.isWrapperType .

Опять же, давайте сначала добавим зависимость от Maven Central :

<dependency>
<groupId>com.google.guava<groupId>
<artifactId>guava<artifactId>
<version>31.0.1-jre<version>
<dependency>

Точно так же мы можем проверить это, используя:

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

Однако метод Primitives.isWrapperType не будет работать с примитивным классом, следующий код вернет false:

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

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

В этом руководстве мы показали, как определить, может ли объект представлять примитивный тип данных, используя нашу собственную реализацию с использованием Java. Затем мы рассмотрели пару популярных библиотек, которые предоставляют служебные методы для достижения этой цели.

Полный код можно найти на Github .