2012-07-11 11 views
14

एक साधारण वर्ग पर विचार करें।तुलनाकारी बनाम अपाचे BeanComparator

class EmpSortByName implements Comparator<Employee>{ 

@Override 
public int compare(Employee e1, Employee e2){ 
    return e1.getName().compareTo(e2.getName()); 
} 
} 

हालांकि, Apache Commons BeanComparator को देख, छँटाई निम्नलिखित तरीके से प्राप्त किया जा सकता:

BeanComparator bc = new BeanComparator("name"); 
Collections.sort(employeeList, bc); 

इस प्रकार, BeanComparator का उपयोग करके, मैं कम से कम कोड के साथ छँटाई प्राप्त कर सकते हैं। तुलनात्मक और बीन कॉम्पैटर का उपयोग करने के बीच व्यापार बंद क्या हैं: प्रदर्शन के संदर्भ में, उपयोग परिदृश्य (एकाधिक फ़ील्ड सॉर्ट, अन्य कारक)?

मैं यह भी समझता हूं कि बीनकॉम्पेटर का उपयोग करने के लिए, बीनटिल जार आयात किया जाना है।

+0

यह एक न्यूनतम "स्पष्ट" कोड है साथ आसान तरीका में अधिक है कि एक विशेषता तुलना कर सकते हैं। भूलें कि आपको नहीं पता कि बीनकंपेटर क्या करता है और –

उत्तर

19

बीनकॉम्पेटर नाम संपत्ति तक पहुंचने और दो वस्तुओं की तुलना करने के लिए प्रतिबिंब का उपयोग करता है। हालांकि प्रतिबिंब प्रदर्शन में सुधार हुआ है, फिर भी यह अभी भी एक फ़ील्ड तक पहुंचने के जितना तेज़ नहीं है। चाहे यह महत्वपूर्ण है या नहीं, इस पर निर्भर करता है कि इसे आपके आवेदन में कितनी बार कहा जाता है, और किस संदर्भ में।

एक और समस्या यह है कि, यदि आप विधि को दोबारा दोहराते हैं और इसे getLastName() पर पुनर्नामित करते हैं, तो बीनकॉम्पेटर का उपयोग करने वाले कोड को दोबारा नहीं किया जाएगा, और समस्या रनटाइम (या यूनिट परीक्षण समय) तक अनजान हो जाएगी।

स्पष्ट रूप से, एक तुलनित्र को लागू करना इतना आसान है कि मुझे नहीं लगता कि प्रतिबिंब का उपयोग करना एक अच्छा विचार है। तुच्छ कोड की 4 लाइनों से परहेज करने का लाभ प्रदर्शन और रखरखाव की समस्याओं को क्षतिपूर्ति करने के लिए पर्याप्त नहीं है।

+0

पहले तरीके से कम प्रदर्शन करने वाला हो सकता है पूरी तरह से +1 – MaVRoSCy

+0

@JB आप सहमत हैं, प्रतिबिंब के कारण प्रदर्शन हिट होगा। BeanComparator किस परिस्थितियों में इस्तेमाल किया जाना चाहिए? क्या 'न्यूनतम' कोड एकमात्र कारण है? क्या आप किसी अन्य कारण से सोच सकते हैं? –

+3

मुझे इसे स्वयं उपयोग करने की आवश्यकता नहीं है, लेकिन मैं इसे यूनिट परीक्षणों में उपयोग करने की कल्पना कर सकता हूं, या जब कोई यूआई गतिशील रूप से चुनने की अनुमति देता है कि किस गुण वस्तु को सॉर्ट किया जाना चाहिए, या जेएसपी टैग में डिस्प्लेटाग जैसे तुलना करना है, जिसे तुलना करना है डेवलपर को एक तुलनित्र प्रदान करने की आवश्यकता के बिना अपने प्रकार को जानने के बिना बीन्स –

2

इसके अलावा beancomparator साथ आप compareTuple org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple); Collections.sort(List,beanComparator);

संबंधित मुद्दे