2010-12-14 4 views
13

जब मैं अपनी परियोजना में एक कोड का विश्लेषण कर रहा था, तो मैं इस स्थिति में आया। मैंकुछ डेवलपर जावा में अपने इंटरफेस में स्ट्रिंग ऑब्जेक्ट्स क्यों घोषित करते हैं, और यह कैसे काम करता है?

public interface SampleInterface { 
    String EXAMPLE_ONE = "exampleOne"; 
    String USER_ID  = "userId"; 

    public void setValue(); 
} 

नीचे के रूप में पूरा स्ट्रिंग स्थिरांक घोषणा के साथ एक अंतरफलक मिल गया है किसी भी वर्ग इस SampleInterface इंटरफ़ेस लागू करता है, तो क्या चर यह वाणी का क्या होगा?

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

    1. अंतिम स्थिर क्षेत्रों और एक निजी निर्माता के साथ एक वर्ग:

इसके अलावा, क्या सबसे अच्छी रणनीति है?

  • ऊपर दिखाई देने वाले चर के साथ एक इंटरफ़ेस?
  • उत्तर

    26

    यह एक आम जावा मुहावरा

    जावा में एक अंतरफलक में है, सभी सदस्यों हैं परोक्षpublic, और विशेष रूप से क्षेत्रों परोक्ष public static final हैं। आपके पास कोई विकल्प नहीं है। यदि आप सार्वजनिक से किसी भी अन्य अनुमति स्तर का उपयोग करने का प्रयास करते हैं, तो संकलक आपको चिल्लाएगा क्योंकि इससे कोई अर्थ नहीं होगा।

    तो कोई कार्यान्वयन वर्ग वास्तव में इन स्थिर स्थिर क्षेत्रों सहित सदस्यों का उत्तराधिकारी होगा।

    लोग इस इडियॉम का उपयोग क्यों करते हैं?

    इंटरफ़ेस में ऐसा करने के कई कारण हैं, और आमतौर पर इसे निरंतर स्टोर के रूप में उपयोग करना है। इस मुहावरे को केवल एक ही स्थान पर स्थिरांक को बंडल करने के लिए उपयोग किया जाता है, अनिवार्य रूप से एक ओओ तरीके से विरासत वृक्ष के हिस्से के रूप में इंटरफ़ेस का उपयोग नहीं किया जाता है।

    तो आप अपने स्थिरांक में से किसी एक तक पहुंचने के लिए usuall MyInterface.MY_CONST के रूप में कॉल कर सकते हैं।

    आप आमतौर पर एक इंटरफ़ेस पर ऐसा करेंगे जब आपको परिभाषित करने के लिए किसी भी व्यवहार की आवश्यकता नहीं होती है, इसलिए जब आपको किसी भी तरीके की आवश्यकता नहीं होती है। यह वास्तव में सिर्फ एक स्थिर स्टोर है (अक्सर, इंटरफेस final भी बनाया जाता है)। आप इसके लिए abstract class का भी उपयोग कर सकते हैं, उदाहरण के लिए यदि आप कार्यान्वयन के विवरण को समाहित और छिपाना चाहते हैं। लेकिन इस मामले में, जहां आपके पास फ़ील्ड और विधियां दोनों हैं, आमतौर पर आपका उद्देश्य कुछ स्थिरांक और उप-वर्ग के लिए अनुबंध प्रदान करता है।

    आपके मामले में ध्यान देने से आपके इंटरफ़ेस के हिस्से के रूप में एक विधि हस्ताक्षर भी है, स्पष्ट रूप से इस इंटरफ़ेस को लागू करने का एक इरादा है।जो मामले में आप अभी भी या तो के रूप में अपने डेटा का उपयोग कर सकते हैं:

    • MyInterface.MY_CONST,
    • या MyExtendingClass.MY_CONST,
    • या instanceOfMyExtendingClass.MY_CONST

      • इस FAQ entry और लोगों को है कि यह पालन करें, के Anon और जेफ दुरुपयोग के बारे में द्वारा
      • टिप्पणियाँ:

      अधिक जानकारी

      अधिक जानकारी के लिए, पर एक नजर है यह फॉर्म,

    • Enum type as introduced since Java 5 (जो, और जैसा कि जॉन द्वारा उल्लेख किया गया है, कई मामलों में डी असीमित रूप से एक बेहतर विचार हो: अधिक सुरुचिपूर्ण, इसे पारित करते समय टाइप-सुरक्षा के अतिरिक्त लाभ के साथ, और मूल्यों को देखने और कुशलतापूर्वक उपयोग करने के लिए काफी अनुकूलित संरचनाओं का उपयोग करना)।
    +0

    आपका कहना है कि सभी स्थिरांक इंटरफ़ेस में रखें और मेरे निष्पादन के दौरान उन्हें एक्सेस करें, मान लीजिए कि कोई वर्ग इस इंटरफ़ेस को लागू करता है, तो उन चर के साथ क्या होता है? – gmhk

    +0

    फिर आप उन्हें 'MyInterface.MY_CONSTANT' या' MyExtendingClass.MY_CONSTANT' के माध्यम से एक्सेस कर सकते हैं। या यहां तक ​​कि 'instanceOfMyExtendingClass.MY_CONSTANT', क्योंकि वे' सार्वजनिक स्थिर अंतिम 'हैं। – haylem

    +0

    कार्यान्वयन कक्षा में, आप इसे 'MY_CONSTANT'' के रूप में भी संदर्भित कर सकते हैं (जो पूरे "स्थिरांक के इंटरफ़ेस" विरोधी पैटर्न के लिए प्रारंभिक कारण है)। हालांकि, यदि यह विशेष रूप से आप के बाद क्या है, तो 'आयात स्थिर' घोषणा किसी कारण से जोड़ा गया था। –

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