ここでは曖昧さの許されたコーディングについて触れます。
コーディング時に、変数の型だけ違っていてその他のロジックは一緒という場合、
異なる型の複数項目・複数行のデータを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; }