เป็นวิธีปฏิบัติที่ดีหรือไม่หากใช้การสะท้อนกลับหากลดจำนวนรหัสสำเร็จรูปลงอย่างมาก?
โดยทั่วไปจะมีการแลกเปลี่ยนระหว่างประสิทธิภาพและความสามารถในการอ่านในด้านหนึ่งและสิ่งที่เป็นนามธรรม / ระบบอัตโนมัติ / การลดรหัสสำเร็จรูปในอีกด้านหนึ่ง
แก้ไข: นี่คือตัวอย่างของการใช้การสะท้อนที่แนะนำ
เพื่อให้ตัวอย่างเช่นสมมติว่ามีระดับนามธรรมBase
ซึ่งมี 10 สาขาและมี 3 subclasses SubclassA
, SubclassB
และSubclassC
แต่ละคนมี 10 สาขาที่แตกต่างกัน พวกเขาทั้งหมดถั่วง่าย ๆ ปัญหาคือคุณได้รับBase
การอ้างอิงสองประเภทและคุณต้องการดูว่าวัตถุที่เกี่ยวข้องนั้นเป็นประเภทเดียวกัน (ย่อย) และเท่ากันหรือไม่
เนื่องจากโซลูชันมีโซลูชันแบบดิบที่คุณตรวจสอบก่อนว่าประเภทเท่ากันหรือไม่จากนั้นตรวจสอบฟิลด์ทั้งหมดหรือคุณสามารถใช้การสะท้อนและดูแบบไดนามิกว่าเป็นประเภทเดียวกันและวนซ้ำทุกวิธีที่ขึ้นต้นด้วย "รับ" (ระเบียบ การกำหนดค่ามากกว่า) เรียกพวกเขาทั้งสองวัตถุและโทรเท่ากับผล
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");
}
}