2015-07-16 6 views
6

मैं निम्नलिखित तरीकेजावा इंटरफ़ेस सबसे अच्छा अभ्यास

public class ObjectA { 
int id ; 
String name; 
} 

public class objectB { 
    Long id; 
    String name; 
} 

में दो वस्तुओं है मैं एक इंटरफेस 'AnObject' है कि इन दो वस्तुओं से लागू किया जाएगा बनाने में सक्षम होना चाहता हूँ। यह इंटरफ़ेस कैसा दिखता है?

public interface AnObject { 
    public <type?> getId() ; 
    public String getName(); 
} 

आईडी के लिए गेटर में किस प्रकार का होना चाहिए?

उत्तर

12

सबसे पहले, इसे Object नाम न दें। Object अन्य सभी वर्गों के लिए जावा की अंतर्निहित बेस क्लास है। तकनीकी रूप से, आप अपने इंटरफ़ेस Object को तब तक नाम दे सकते हैं जब तक आप इसे पैकेज java.lang पैकेज में न रखें, लेकिन यह अत्यधिक भ्रामक होगा।

ObjectA और ObjectB, उपयोग जेनरिक में getId() के लिए विभिन्न प्रकार के रिटर्न प्रदान करने के लिए: हमेशा एक नंबर प्रदान करता है

public interface MyObject<T> { 
    T getId(); 
    String getName(); 
} 

public class ObjectA implements MyObject<Integer> { 
    @Override 
    public Integer getId() { 
    return 0; 
    } 

    @Override 
    public String getName() { 
    return "A"; 
    } 
} 

public class ObjectB implements MyObject<Long> { 
    @Override 
    public Long getId() { 
    return 0; 
    } 

    @Override 
    public String getName() { 
    return "B"; 
    } 
} 

तो getId(), आप भी MyObject<T extends Number> रूप MyObject निर्धारित कर सकते हैं। ध्यान दें कि आप जेनेरिक के साथ मूल प्रकार int और long का उपयोग नहीं कर सकते हैं; आपको बॉक्स किए गए प्रकार Integer और Long का उपयोग करना होगा।

+1

धन्यवाद रॉबिन, यह उपयोगी है। कीवर्ड 'ऑब्जेक्ट' उदाहरण के लिए उदाहरण था –

+2

हम 'सार्वजनिक इंटरफ़ेस MyObject <टी संख्या>> को जोड़कर इस समाधान को बेहतर बना सकते हैं क्योंकि हम उम्मीद करते हैं कि टाइप 'टी' एक संख्या हो। –

+0

@ piotr.wittchen आप सही हैं; मेरे उत्तर के अंतिम अनुच्छेद पर एक नज़र डालें। ;) –

0

मान लीजिए कि आपकी आईडी हमेशा एक संख्या है।

यदि आपके गेटर getId() का उपयोगकर्ता वापसी मूल्य के वास्तविक प्रकार की देखभाल नहीं करता है (या नहीं) तो आप सीधे जेनिक्स के बिना Number का उपयोग कर सकते हैं। यदि आप जेनेरिक का उपयोग करना चाहते हैं या नहीं तो यह संदर्भ पर निर्भर करता है। इस मामले में जेनेरिक का उपयोग करके का लाभ यह नहीं होगा कि आपको आईडी के वास्तविक प्रकार को परिभाषित करने की आवश्यकता नहीं है, जो MyObject के कार्यान्वयन के साथ कॉलिंग कोड को कम करता है।

public interface AnObject { 
    public Number getId() ; 
    public String getName(); 
} 

कोड जो इसे कॉल करता है, उसे आईडी के वास्तविक प्रकार को नहीं पता होगा। हालांकि वे अभी भी सुनिश्चित कर सकते हैं कि यह एक संख्या है और कॉलिंग कोड की आवश्यकता के रूप में Number.doubleValue() या Number.longValue() जैसी चीजें कॉल कर सकते हैं।

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