1. Обзор
Иногда нам нужно определить, является ли объект примитивным типом, особенно для примитивных типов оболочек. Однако в стандартном JDK нет встроенных методов для достижения этой цели.
В этом кратком руководстве мы рассмотрим, как реализовать решение с использованием ядра Java. Затем мы рассмотрим, как мы можем достичь этого, используя пару часто используемых библиотек.
2. Примитивы и классы-оболочки
Существует девять предопределенных объектов для представления восьми примитивов и типа void в Java. Каждый примитивный тип имеет соответствующий Класс-оболочку .
Чтобы узнать больше о Примитивах и объектах , пожалуйста, ознакомьтесь с этой статьей .
То То . isPrimitive() метод может определить, представляет ли указанный объект примитивный тип. Однако он не работает на обертках для примитивов.
Например, следующий оператор возвращает false :
Integer.class.isPrimitive();
Теперь давайте рассмотрим различные способы достижения этой цели.
3. Использование ядра Java
Во-первых, давайте определим переменную HashMap, которая хранит оболочку и классы примитивных типов:
private static final Map, Class>> WRAPPER_TYPE_MAP; static { WRAPPER_TYPE_MAP = new HashMap , 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); }
Если объект является примитивным классом-оболочкой, мы можем посмотреть его из предопределенного Хэш-карта переменная с java.util.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 . primitivetowrapper метод, который можно использовать для определения, является ли класс примитивом или оболочкой примитива .
Во-первых, давайте добавим commons-lang3 зависимость от Maven Central в наш pom.xml :
org.apache.commons commons-lang3 3.11
Тогда давайте проверим это:
assertTrue(ClassUtils.isPrimitiveOrWrapper(Boolean.False.getClass())); assertTrue(ClassUtils.isPrimitiveOrWrapper(boolean.class)); assertFalse(ClassUtils.isPrimitiveOrWrapper(StringUtils.EMPTY.getClass()));
5. Использование примитивов Гуавы.isWrapperType()
Guava обеспечивает аналогичную реализацию с помощью примитивов .Метод isWrapperType .
Опять же, давайте сначала добавим зависимость от Maven Central :
com.google.guava guava 29.0-jre
Аналогично, мы можем протестировать его с помощью:
assertTrue(Primitives.isWrapperType(Boolean.FALSE.getClass())); assertFalse(Primitives.isWrapperType(StringUtils.EMPTY.getClass()));
Однако Примитивы.Метод isWrapperType не будет работать с примитивным классом, следующий код вернет false:
assertFalse(Primitives.isWrapperType(boolean.class));
6. Заключение
В этом руководстве мы проиллюстрировали, как определить, может ли объект представлять примитивный тип данных, используя нашу собственную реализацию с использованием Java. Затем мы взглянули на пару популярных библиотек, которые предоставляют полезные методы для достижения этой цели.
Полный код можно найти на Github .