【Java備忘録】ラッパークラス、List、Map、配列の中身の自動判別

ここでは曖昧さの許されたコーディングについて触れます。

コーディング時に、変数の型だけ違っていてその他のロジックは一緒という場合、
異なる型の複数項目・複数行のデータをDBからList、Mapで一括取得して、型によって判定を変えたい場合、
同じようなコードを書かないためにどうすればよいか、
と考えることがあると思います。

そこで活用するのが「Object型」です。

List型やMap型、ラッパークラス(Byte,Boolean,Integer,Long..)等のすべてのクラスの祖先である魔法の(?)というか曖昧な型です。

オブジェクトがない(null)なのか、Listなのか、Mapなのか、文字列なのか、数値型なのか、その他なのかを判別するのに
「instanceof」を使います。

変数が指定したクラス/インターフェースかどうかを判断します。以下のようにコーディングします。
変数 instanceof クラス名(対象のクラスまたはスーパークラス)|インターフェース名
※変数に基本クラスの指定はNGです。

百聞は一見に如かず。以下のソースを試して自分のものにしてみましょう。(一部抜粋して掲載)

    /**
     * 型判定出力
     * 
     * @param obj オブジェクト型の値
     * @param intDept 階層
     */
    private static void anythingOutput(Object obj, int intDept) {
        System.out.print(blank(intDept));

        if(obj == null) {
            System.out.print("[null]");

        } else if(obj.getClass().isArray()) {

            //オブジェクトが配列の場合
            int len = Array.getLength(obj);
            System.out.print("[Array] value= {\n");
            for(int i=0; i < len; i++) {
                //リストの件数分、再帰的な処理を行う
                anythingOutput(Array.get(obj, i), intDept + 1);
            }
            System.out.print(blank(intDept) + "}");

        } else if(obj instanceof List<?>) {
            //オブジェクトがリスト型の場合
            List<?> list = (List<?>)obj;
            
            System.out.print("[List] value= {\n");
            for(Object row : list) {
                //リストの件数分、再帰的な処理を行う
                anythingOutput(row, intDept + 1);
            }
            System.out.print(blank(intDept) + "}");

        } else {
            //オブジェクトがリスト型でない場合
                if(obj instanceof Map) {
                    //Mapの場合
                    Map map = (Map) obj;
                    System.out.print("[Map] value={\n");
                    Iterator<?> keyItr = map.keySet().iterator();
                    Object key = null;
                    while(keyItr.hasNext()) {
                        //キーが取得できる場合、出力
                        key = keyItr.next();
                        anythingOutput(key, intDept + 1);
                        System.out.print(blank(intDept + 1) + " : ");
                        anythingOutput(map.get(key), 0);
                    }
                    System.out.print(blank(intDept) + "}");

                } else if(obj instanceof String) {
                    //文字列の場合
                    System.out.print("["+ obj.getClass().getName() +"] value=\"" + (String)obj + "\"");

                } else if(obj instanceof Number) {
                    //数値の場合
                    System.out.print("["+ obj.getClass().getName() +"] value=\"" + ((Number)obj).toString() + "\"");

                } else {
                    //その他の場合(toStringはObjectのメソッド)
                    System.out.print("["+ obj.getClass().getName() +"] value=\"" + obj.toString() + "\"");
                }
        }
        System.out.print("\n");
        return;
    }

    /**
     * 空白文字返却
     * 
     * @param 空白文字繰り返し回数
     * @return 空白文字列
     */
    private static String blank(int intRepeat) {
        String strBlank = "";
        for(int i = 0; i < intRepeat; i++) {
            strBlank = strBlank.concat(" ");
        }
        return strBlank;
    }

objectTest.java 全ソースを見る

タイトルとURLをコピーしました