বয়লারপ্লেট কোডের পরিমাণটি যদি হ্রাস করে তবে প্রতিবিম্বটি ব্যবহার করা কি একটি ভাল অনুশীলন?
মূলত পারফরম্যান্স এবং সম্ভবত একপাশে পাঠযোগ্যতা এবং অন্যদিকে অ্যাবস্ট্রাকশন / অটোমেশন / অন্যদিকে বয়লারপ্লেট কোড হ্রাসের মধ্যে একটি বাণিজ্য রয়েছে।
সম্পাদনা: প্রতিবিম্বের প্রস্তাবিত ব্যবহারের উদাহরণ এখানে ।
একটি উদাহরণ দিতে, অনুমান করা সেখানে একটি বিমূর্ত ক্লাস হয় Base
যা 10 ক্ষেত্রের এবং 3 উপশ্রেণী রয়েছে SubclassA
, SubclassB
এবং SubclassC
10 বিভিন্ন ক্ষেত্রে সঙ্গে প্রতিটি; তারা সব সহজ মটরশুটি হয়। সমস্যাটি হ'ল আপনি দুটি Base
প্রকারের রেফারেন্স পান এবং আপনি দেখতে চান তাদের সংশ্লিষ্ট বস্তুগুলি একই (উপ) ধরণের এবং সমান কিনা।
সমাধান হিসাবে কাঁচা সমাধান রয়েছে যেখানে আপনি প্রথমে প্রকারগুলি সমান কিনা তা পরীক্ষা করে দেখুন এবং তারপরে সমস্ত ক্ষেত্র পরীক্ষা করুন বা আপনি প্রতিবিম্বটি ব্যবহার করতে পারেন এবং গেইনিকভাবে দেখতে পারেন যে তারা একই ধরণের কিনা এবং "get" (কনভেনশন) দিয়ে শুরু হওয়া সমস্ত পদ্ধতিতে পুনরাবৃত্তি করতে পারেন ওভার কনফিগারেশন), উভয় বস্তুগুলিতে তাদের কল করুন এবং ফলাফলগুলির সমান কল করুন।
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");
}
}