1. 概要

特にラッパープリミティブ型の場合、オブジェクトがプリミティブ型であるかどうかを判断する必要がある場合があります。 ただし、これを実現するための組み込みメソッドは標準JDKにはありません。

このクイックチュートリアルでは、コアJavaを使用してソリューションを実装する方法を説明します。 次に、一般的に使用されるいくつかのライブラリを使用してこれを実現する方法を見ていきます。

2. プリミティブとラッパークラス

Javaには、8つのプリミティブとvoidタイプを表す9つの定義済みオブジェクトがあります。 各プリミティブ型には、対応するラッパークラスがあります。

プリミティブおよびオブジェクトの詳細については、この記事を参照してください。

java.lang.ClassisPrimitive()メソッドは、指定されたオブジェクトがプリミティブ型を表すかどうかを判別できます。 ただし、プリミティブのラッパーでは機能しません。

たとえば、次のステートメントは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);
}

オブジェクトがプリミティブラッパークラスの場合、 java.utils.Map.ContainsKey()メソッドを使用して、事前定義されたHashMap変数からオブジェクトを検索できます。

これで、オブジェクトソースがプリミティブ型であるかどうかを判断するための簡単なユーティリティメソッドを作成できます。

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依存関係をMavenCentralから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. Guavaの使用–Primitives。isWrapperType()

Guava は、Primitives.isWrapperTypeメソッドを介して同様の実装を提供します。

繰り返しになりますが、最初に MavenCentralからの依存関係を追加しましょう。

<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にあります。