昨日教えてもらった、ECMAScript4の言語仕様。
var v: like { x: 10, y: 15 }
で、vがxとyのプロパティを持っていて、それぞれ10か15かを調べられるらしい。
Javaだとこんな具合だろうか。
public class Like { public static boolean like(Object src,Object target){ return like(src,target,true); } public static boolean like(Object src,Object target,boolean strict){ Map<String,Object> srcMap = toMap(src); Map<String,Object> targetMap = toMap(target); if(strict && (srcMap.keySet().size() != targetMap.keySet().size())){ return false; } for(String key:srcMap.keySet()){ if(strict && !targetMap.containsKey(key)){ return false; } Object srcValue = srcMap.get(key); Object targetValue = targetMap.get(key); if(srcValue != targetValue){ if(srcValue != null && !srcValue.equals(targetValue)){ return false; } } } return true; } private static Map<String,Object> toMap(Object o){ if(o instanceof Map){ for(Object key:((Map)o).keySet()){ if(!(key instanceof String)){ throw new RuntimeException(key.getClass() + " key not support."); } } return (Map<String,Object>)o; } try{ PropertyDescriptor[] descs = Introspector.getBeanInfo(o.getClass()).getPropertyDescriptors(); Map<String,Object> map = new HashMap<String,Object>(); for(int i = 0;i < descs.length;i++){ PropertyDescriptor desc = descs[i]; Method readMethod = desc.getReadMethod(); if(readMethod != null && !desc.getName().equals("class")){ Object value = readMethod.invoke(o,(Object[])null); map.put(desc.getName(),value); } } return map; } catch(Exception e){ throw new RuntimeException(e); } } }
Like.like(比較先オブジェクト、比較対象オブジェクト)で、型に関係なく、同じプロパティを持っているかどうかを
チェックできます。第3引数はプロパティの数があっているときに無視するかどうかのオプション。
DtoとModelのデータが等しいかどうかに使える、かも。