2016-01-08 16 views
7

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

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner {} 
} 

ध्यान में रखते हुए मैं जानकारी

Name 
    private field Inner mInner 

Location 
    class Outer (default package) 

Problem synopsis 
    Access to private member of class 'Inner' at line 2 

Problem resolution 
    Make 'Inner' constructor package-local 

समस्या संकल्प को लागू करने पाने के पल में

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner { 
     Inner() {} 
    } 
} 

के स्रोत मैं एक छोटे से उलझन में हूँ बदल जाता है। अब तक मैंने सोचा था कि उदाहरण के लिए

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner { 
     public Inner() {} 
    } 
} 

Am मैं इस मामले में गलत बराबर होगा या यह फाहा का एक मुद्दा है?

+0

संभावित डुप्लिकेट [क्या हमें सार्वजनिक कन्स्ट्रक्टर घोषित करना चाहिए जब कक्षा को पैकेज के रूप में घोषित किया जाता है?] (Http://stackoverflow.com/questions/243218/should-we-declare-a-public-constructor-when- द क्लास-घोषित-ए-पैकेज-प्राइ) –

+0

जब भी आप कक्षा को निजी घोषित करते हैं, उस वर्ग से संबंधित सबकुछ निजी हो जाता है – awsome

+0

@ क्रिकेट_007 दुख की बात नहीं। इसमें भाग लिंट के बारे में शिकायत नहीं है। – tynn

उत्तर

2

Section 8.8.9 of the Java language specification, "Default constructor" का कहना है:

एक वर्ग प्रकार में, अगर वर्ग सार्वजनिक घोषित किया जाता है, तो डिफ़ॉल्ट निर्माता परोक्ष पहुँच संशोधक (§6.6) सार्वजनिक दिया गया है; यदि कक्षा को संरक्षित घोषित किया गया है, तो डिफ़ॉल्ट कन्स्ट्रक्टर स्पष्ट रूप से एक्सेस संशोधक संरक्षित (§6.6) दिया गया है; यदि वर्ग निजी घोषित किया गया है, तो डिफ़ॉल्ट कन्स्ट्रक्टर को एक्सेस संशोधक निजी (§6.6) दिया गया है; अन्यथा, डिफ़ॉल्ट कन्स्ट्रक्टर में कोई एक्सेस संशोधक द्वारा निहित डिफ़ॉल्ट पहुंच है।

1

आप अपनी समझ में गलत हो, लेकिन लिंटर विशेष रूप से स्पष्ट नहीं किया जा रहा है, और सलाह शायद नहीं प्रासंगिक Android के लिए (जो जे 2 एमई नहीं है) है।

जैसा कि डेविड ने समझाया, आंतरिक वर्ग के निहित डिफ़ॉल्ट कन्स्ट्रक्टर के पास कक्षा के समान ही संशोधक है, लेकिन निजी सदस्य एक ही संकलन इकाई (जावा फ़ाइल) के भीतर पहुंच योग्य हैं। निजी कन्स्ट्रक्टर से बचने के लिए कोई भाषा कारण नहीं है।

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

एंड्रॉइड क्लास फाइलों पर महत्वपूर्ण पोस्ट-प्रोसेसिंग करता है, और एंड्रॉइड डिवाइस लगभग जे 2 एमई डिवाइस के रूप में बाध्य नहीं हैं। जब तक आप दोनों प्लेटफॉर्म को लक्षित करने के लिए कोड नहीं लिख रहे हैं, तो मैं लिंट कॉन्फ़िगरेशन बदल दूंगा।

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