Isı levhası kodunun miktarını büyük ölçüde azaltırsa yansıma kullanmak iyi bir uygulama mı?
Temel olarak bir tarafta performans ve belki de okunabilirlik ile diğer tarafta kazan plakası kodunun soyutlanması / otomasyonu / azaltılması arasında bir denge vardır.
Düzenleme: İşte önerilen bir yansıma kullanımı örneği .
Bir örnek vermek gerekirse, bir soyut bir sınıf olduğunu varsayalım Base
10 alan ve 3 alt sınıfları vardır SubclassA
, SubclassB
ve SubclassC
10 farklı alanların her biri; hepsi basit fasulye. Sorun iki Base
tür başvuru almak ve karşılık gelen nesnelerin aynı (alt) türü ve eşit olup olmadığını görmek istediğiniz olmasıdır.
Çözümler olarak, türlerin eşit olup olmadığını ilk önce kontrol ettiğiniz ve sonra tüm alanları kontrol ettiğiniz veya yansımayı kullanıp aynı türden olup olmadıklarını dinamik olarak görebileceğiniz ve "get" (kongre) ile başlayan tüm yöntemler üzerinde yineleme yapabileceğiniz ham bir çözüm vardır. her iki nesnede de çağırın ve sonuçlarda çağrı eşittir.
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");
}
}