상용구 코드의 양을 크게 줄이면 리플렉션을 사용하는 것이 좋습니까?
기본적으로 한쪽면의 성능과 가독성과 다른 쪽면의 보일러 플레이트 코드의 추상화 / 자동화 / 감소 사이에는 균형이 있습니다.
편집 : 다음은 반사 사용을 권장하는 예입니다. .
예를 들어, Base
10 개의 필드와 3 개의 서브 클래스 SubclassA
가 SubclassB
있고 SubclassC
각각 10 개의 다른 필드 가 있는 추상 클래스가 있다고 가정하십시오 . 그들은 모두 간단한 콩입니다. 문제는 두 개의 Base
유형 참조 를 얻고 해당 객체가 동일한 (하위) 유형이고 동일한 지 확인하려는 것입니다.
솔루션으로 먼저 유형이 같은지 확인한 다음 모든 필드를 확인하거나 리플렉션을 사용하고 동일한 유형인지 동적으로 확인하고 "get"(컨벤션)으로 시작하는 모든 메소드를 반복적으로 처리 할 수있는 원시 솔루션이 있습니다. 구성에 대해), 두 객체 모두에서 호출하고 결과에서 equals를 호출하십시오.
boolean compare(Base base1, Base, base2) {
if (base1 instanceof SubclassA && base2 instanceof SubclassA) {
SubclassA subclassA1 = (SubclassA) base1;
SubclassA subclassA2 = (SubclassA) base2;
compare(subclassA1, subclassA2);
} else if (base1 instanceof SubclassB && base2 instanceof SubclassB) {
//the same
}
//boilerplate
}
boolean compare(SubclassA subA1, SubclassA subA2) {
if (!subA1.getField1().equals(subA2.getField1)) {
return false;
}
if (!subA1.getField2().equals(subA2.getField2)) {
return false;
}
//boilerplate
}
boolean compare(SubclassB subB1, SubclassB subB2) {
//boilerplate
}
//boilerplate
//alternative with reflection
boolean compare(Base base1, Base base2) {
if (!base1.getClass().isAssignableFrom(base2.getClass())) {
System.out.println("not same");
System.exit(1);
}
Method[] methods = base1.getClass().getMethods();
boolean isOk = true;
for (Method method : methods) {
final String methodName = method.getName();
if (methodName.startsWith("get")) {
Object object1 = method.invoke(base1);
Object object2 = method.invoke(base2);
if(object1 == null || object2 == null) {
continue;
}
if (!object1.equals(object2)) {
System.out.println("not equals because " + object1 + " not equal with " + object2);
isOk = false;
}
}
}
if (isOk) {
System.out.println("is OK");
}
}