2012-04-04 8 views
5

मैं "प्रैक्टिकल एपीआई डिजाइन" पढ़ रहा हूँ और निम्नलिखित पैरा लगता है:।बाइनरी संगतता के लिए सार्वजनिक क्षेत्र के अलावा गेटर/सेटर का उपयोग करना?

"क्षेत्रों पर तरीकों को पसंद करते हैं अन्य कारण JVM विनिर्देश में पाया जा सकता है आप एक वर्ग से एक के लिए एक विधि को स्थानांतरित करने की अनुमति दी रहे हैं इसके सुपरक्लास और अभी भी बाइनरी संगतता बनाए रखते हैं। इसलिए, प्रारंभ में एक विधि आयाम javax.swing.JComponent के रूप में पेश की गई। getPreferredSize (आयाम डी) को एक नए संस्करण में हटाया जा सकता है और आयाम java.awt.Component.getPreferredSize (आयाम डी) में स्थानांतरित किया जा सकता है। , क्योंकि जेकंपोनेंट घटक का उप-वर्ग है। इस तरह का एक बदलाव वास्तव में जेडीके 1.2 में हुआ था, और यह केवल इसलिए किया जा सकता था क्योंकि इस क्षेत्र को एक विधि द्वारा encapsulated था। इस तरह के एक ऑपरेशन फ़ील्ड के लिए अनुमति नहीं है। एक बार एक क्षेत्र एक वर्ग में परिभाषित किया गया है, इसे वहां रहना है बाइनरी संगतता को बनाए रखने के लिए आर, जो फ़ील्ड को निजी रखने के लिए एक और कारण है "

क्योंकि मैं गेटर/सेटर का उपयोग करने से सहमत हूं बेहतर तरीका है। लेकिन मुझे समझ में नहीं आता कि क्यों सार्वजनिक क्षेत्र को सार्वजनिक वर्ग में ले जाना बाइनरी संगतता को तोड़ देगा? जब तक कि यह माता-पिता में सार्वजनिक न हो तब तक आपको उस वर्ग को बाल वर्ग के माध्यम से एक्सेस करने में सक्षम होना चाहिए।

उत्तर

3

एक बार एक क्षेत्र एक कक्षा में परिभाषित किया गया है, यह हमेशा के दोहरी संगतता वहाँ रहना बनाए रखने के लिए है

कि बहुत ही आश्चर्य होगा:

जावा भाषा विशिष्टता, जावा SE 7 संस्करण , defines एक अयोग्य फ़ील्ड एक्सेस अभिव्यक्ति का द्विआधारी नाम निम्नानुसार है:

एक कानूनी अभिव्यक्ति को देखते हुए एक क्षेत्रीय पहुंच को दर्शाता है एक वर्ग सी, एक गैर निरंतर (§13.4.9) एक (संभवतः अलग) वर्ग या इंटरफ़ेस डी में घोषित च नामित क्षेत्र को संदर्भित, हम क्षेत्र संदर्भ की योग्यता प्रकार इस प्रकार निर्धारित करें:

  • हैं अभिव्यक्ति तो प्रपत्र Primary.f की है:
    • प्राथमिक के संकलन समय प्रकार एक चौराहे का प्रकार (§4.9) V1 & ... & वी.एन., तो संदर्भ की योग्यता प्रकार V1 है है।
    • अन्यथा, संकलन-समय का प्राथमिक प्रकार संदर्भ का योग्यता प्रकार है।

(जावा 1 के लिए भाषा विशिष्टता।5 uses सटीक वही शब्दलेखन)

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

दरअसल, जब मैं फिर कंपाइल

package p; 

public class Main { 
    public static void main(String[] args) { 
     Sub sub = new Sub(); 
     sub.message = "hello"; 
     System.out.println(sub); 
     System.out.println(sub.message); 
    } 
} 

मैं अभी भी

hello 
hello 
के उत्पादन प्राप्त बिना

package p; 

public class Super { 
    public String message; 
} 

package p; 

public class Sub extends Super { 
    @Override 
    public String toString() { 
     return message; 
    } 
} 

को

package p; 

public class Super { 

} 

package p; 

public class Sub extends Super { 
    public String message; 

    @Override 
    public String toString() { 
     return message; 
    } 
} 

से विकसित करने के लिए अभी-अभी की कोशिश की

, LinkageError नहीं।

निष्कर्ष निकालने के लिए, यह दावा जावा 7 के लिए सच नहीं है। यह जेडीके 1.4 या उससे पहले के लिए सच हो सकता है, जिसे 5 साल से अधिक समय के अंत में घोषित किया गया था। किसी भी तरह से, शायद आपको एक बेहतर/अधिक हाल की किताब का उपयोग करना चाहिए?

+0

यह केवल एक चीज है जिसे मैं अनुमान लगा सकता हूं। शायद बहुत पुराने समय में, यह है। –

0

यदि मुझे सही याद है तो पुस्तक यह बताती है, लेकिन मेरे पास वर्तमान में यह नहीं है। मुझे लगता है कि यह जावा भाषा और कक्षा फ़ाइल प्रारूप के बीच सूक्ष्म मतभेदों के बारे में था (जिसे जावा की तुलना में अन्य भाषाओं द्वारा भी उपयोग किया जाता है)।

पुस्तक को पहले या बाद में थोड़ा सा चेक करें। पूछें कि क्या उस हिस्से के बारे में आपके पास और प्रश्न हैं।

+0

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

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