मैं समानता सभी गुणों के बीच 2 उदाहरणों के बीच गुणों यानी के लिए एक सामान्य बराबर() विधि के लिए मूल्यांकन करने के लिए org.apache.commons.beanutils लाइब्रेरी को विधि/मुहावरे के लिए ग्रोक करने का प्रयास कर रहा हूं।
क्या इस पुस्तकालय का उपयोग करने का कोई आसान तरीका है? या क्या मैं इस बारे में गलत तरीके से जा रहा हूं? धन्यवाद।सामान्य जावा बीन्स की तुलनात्मक रूप से तुलना कैसे करें?
उत्तर
EqualsBuilder.reflectionEquals()commons-lang का प्रयास करें। EqualsBilder के पास सभी फ़ील्ड, सभी गैर-क्षणिक फ़ील्ड और कुछ निश्चित फ़ील्ड शामिल करने के तरीकों का एक सेट है।
यदि अन्य सभी विफल हो जाते हैं, तो कोड इसे लागू करने के लिए एक अच्छा उदाहरण के रूप में कार्य कर सकता है।
में एक छोटे से वृद्धि की आवश्यकता होगी चेतावनी दी जाती है कि यह रिकर्सिव नहीं है - इसलिए यदि आपके पास नेस्टेड सेम हैं (यानी एक बीन की एक और बीन है), तो वे खुद को बराबर करने की जरूरत है। 'प्रतिबिंब एक्वाल्स 'प्रत्येक संपत्ति पर केवल' बराबर 'कहता है, यह कक्षा में आगे नहीं दर्शाता है। – artbristol
@artbristol: +1 लेकिन सावधान रहें बराबर बराबर होगा: बीन्स बनाने के चक्रों पर आप लूप में आसानी से पकड़े जा सकते हैं। –
सीधे अपने प्रश्न का उत्तर देने के लिए, आप बीन्स की समानता जांच करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। ऐसे कुछ स्नैग हैं जिनके बारे में आपको अवगत होना चाहिए।
बराबर() और हैशकोड() के व्यवहार के संबंध में नियम हैं। ये नियम समरूपता, consitency और reflexiveness जो जब अपने बराबर विधि गतिशील अन्य वस्तु आप में गुजर रहे हैं के आधार पर व्यवहार करने के लिए मुश्किल हो सकता है के बारे में बात
दिलचस्प पढ़ने:। http://www.geocities.com/technofundo/tech/java/equalhash.html
सामान्य शब्दों में, मुझे लगता है कि आप अपना खुद का हैशकोड बनाने और विधियों के बराबर बनाने से बेहतर हैं। एक Fwe अच्छे प्लगइन्स हैं जो कक्षा गुणों के आधार पर आपके लिए स्वचालित रूप से उस कोड को उत्पन्न कर सकते हैं।
करने के बाद यह सब कहा, यहाँ कुछ (पुरानी शैली) हो रही ही टिककर खेल, setters और गुण के लिए तरीके मैं एक लंबे समय पहले लिखा हैं:
private Map getPrivateFields(Class clazz, Map getters, Map setters) {
Field[] fields = clazz.getDeclaredFields();
Map m = new HashMap();
for (int i = 0; i < fields.length; i++) {
int modifiers = fields[i].getModifiers();
if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers)) {
String propName = fields[i].getName();
if (getters.get(propName) != null && setters.get(propName) != null) {
m.put(fields[i].getName(), fields[i]);
}
}
}
return m;
}
Getters:
private Map getGetters(Class clazz) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("get")) {
int modifiers = methods[i].getModifiers();
if (validAccessMethod(modifiers)) {
m.put(getPropertyName(methods[i].getName()), methods[i]);
}
}
}
return m;
}
और सेटर्स:
private Map getSetters(Class clazz, Map getters) {
Method[] methods = clazz.getMethods();
Map m = new HashMap();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("set")) {
int modifiers = methods[i].getModifiers();
String propName = getPropertyName(methods[i].getName());
Method getter = (Method) getters.get(propName);
if (validAccessMethod(modifiers) && getter != null) {
Class returnType = getter.getReturnType();
Class setType = methods[i].getParameterTypes()[0];
int numTypes = methods[i].getParameterTypes().length;
if (returnType.equals(setType) && numTypes == 1) {
m.put(propName, methods[i]);
}
}
}
}
return m;
}
शायद आप इसे स्वयं रोल करने के लिए इसका उपयोग कर सकते हैं।
संपादित करें:reflectionbuilder बेशक Aaron Digulla's answer में मेरी बुनाई की तुलना में बेहतर है।
बुलियन गेटर्स को isFoo() कहा जाता है, इसलिए कोड को गेटगेटर्स() –
जैसा ऊपर बताया गया है, एक प्रतिबिंब-आधारित कार्यान्वयन जो आप चाहते हैं वह करेगा। मैं बस आपको चेतावनी देना चाहता था कि प्रतिबिंब काफी महंगा है और ऐसा कार्यान्वयन तुलनात्मक रूप से धीमा हो सकता है। यदि आपको कभी-कभी तुलना करने की ज़रूरत है, तो आप ठीक होंगे। हालांकि, यदि आपके पास विशाल डेटासेट और लगातार समानता जांच (जैसे बड़ी टेबलों का फ़िल्टरिंग) है तो आपको परेशानी हो सकती है।
वास्तव में अच्छा बिंदु। jguru की एक अच्छी तुलना ऑनलाइन है: http://www.jguru.com/faq/view.jsp?EID=246569 – Rolf
या, हालांकि नहीं अपने प्रश्न के लिए एक सीधा जवाब है, लेकिन यह आपकी समस्या का उत्तर यदि आप ग्रहण का उपयोग
(यानी बॉयलरप्लेट कोड जबकि सुपर तेजी से किया जा रहा है ऐसा करने का प्रयास निकालने के लिए), हो सकता है निम्न चरणों के ऑटो hashCode उत्पन्न होगा और आप के लिए बराबर है:
स्रोत> जनरेट hashCode और बराबर होती है ...
और फिर फ़ील्ड चुनते हैं, यह सुपर प्रभावी है!: डी
चीयर्स और मुझे आशा है कि यह किसी भी समय बॉयलरप्लेट लिखने के उद्देश्य से यहां आने में सहायता करता है।
पीएस: मुझे यकीन है कि अन्य लोकप्रिय आईडीई में समान सुविधाएं होनी चाहिए।
[xtendbeans लाइब्रेरी] (http://stackoverflow.com/a/39222891/421602) इस संदर्भ में रुचि का हो सकता है; [इस अन्य SO प्रश्न पर पूरा उदाहरण देखें] (http://stackoverflow.com/a/39222891/421602)। – vorburger