2010-08-26 7 views
43

किसी भी जावा फ़ाइल में, हमारे पास केवल एक सार्वजनिक वर्ग क्यों हो सकता है जिसका नाम जावा फ़ाइल नाम के समान है?जावा फ़ाइल में केवल 1 सार्वजनिक वर्ग क्यों

+45

** क्योंकि [वह] (http://en.wikipedia.org/wiki/James_Gosling) ने ऐसा कहा !! ** – jjnguy

+2

कंपाइलर को कक्षा परिभाषा आसानी से प्राप्त करने की अनुमति देने के लिए। उस तरह संकलित करना आसान है। मेरे पास कोई संदर्भ नहीं है (यही कारण है कि यह एक टिप्पणी है) लेकिन मुझे लगता है कि नीचे दिए गए उत्तरों उस पर इंगित करते हैं। – OscarRyz

+1

दूसरे शब्दों में, यदि आप असहमत हैं तो अपनी खुद की प्रोग्रामिंग भाषा का आविष्कार करें :) – BalusC

उत्तर

15

this source के अनुसार, यह कुशल संकलन के लिए है:

साइडबार यह बताता है कि क्यों में: "यह प्रतिबंध अभी तक संकलक द्वारा लागू नहीं की है, हालांकि यह कुशल पैकेज आयात के लिए आवश्यक है"

यह बहुत स्पष्ट है - अधिकांश चीजों की तरह एक बार जब आप डिज़ाइन कारणों को जानते हैं - कंपाइलर कोके माध्यम से अतिरिक्त पास करना होगासंकलन इकाइयों (.java फ़ाइलें) पर पता लगाएं कि कक्षाएं कहां थीं, और इससे संकलन भी धीमा हो जाएगा।

आईडीई में स्रोत फ़ाइलों के आयात के लिए भी लागू होता है। एक और कारण उचित स्रोत आकार होगा।

22

यह बलों सभी जावा कोड एक निश्चित तरीके से, जो लंबे समय में कोड पठनीयता सुधार में मदद करता में आयोजित किया जाना है।

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

+1

+1, पूरी तरह से सहमत हैं, नरक मुझे यह सी # में याद आती है। यहां तक ​​कि यदि मैं हमेशा प्रत्येक वर्ग/enum/struct के लिए एक अलग फ़ाइल का उपयोग करता हूं तो मैंने भयानक चीजें देखी हैं :-) –

+3

यह और भी सख्त होना चाहिए और गैर-सार्वजनिक वर्गों पर भी लागू होना चाहिए। अधिकांश लोग इसे सही तरीके से करते हैं, लेकिन कुछ अभी भी एक फ़ाइल में कई डिफ़ॉल्ट दृश्यमान कक्षाओं को डालकर गड़बड़ी करने में कामयाब होते हैं। – starblue

+1

क्या आपके पास दावा का समर्थन करने के लिए एक उद्धरण है कि कोड पठनीयता योग्यता कारण है कि डिजाइनरों ने इस प्रतिबंध को चुना? – Rohit

8

ये नियम हैं। हालांकि यह काफी सच नहीं है। आप आप के अंदर आंतरिक वर्गों को परिभाषित कर सकते हैं "मुख्य" इस तरह वर्ग:

public class A { 
    public class B { 
     ... 
    } 
} 
+2

गैर-सार्वजनिक शीर्ष-स्तरीय कक्षाओं के लिए समान मान्य –

0

यह संकलन (आयात निर्देश) के दौरान स्रोत (जावा) और संकलित ( .class) फ़ाइलों के एक अधिक कुशल देखने के लिए सक्षम बनाता है और एक निष्पादन के दौरान अधिक कुशल वर्गीकरण। विचार यह है कि: यदि आप कक्षा के नाम को जानते हैं, तो आप जानते हैं कि प्रत्येक क्लासपाथ प्रविष्टि के लिए यह कहां पाया जाना चाहिए। कोई अनुक्रमण आवश्यक नहीं है।

+0

रनटाइम क्लास-लोडिंग के बारे में गलत। अगर मेरे पास एक फ़ाइल X.java है जिसमें सार्वजनिक वर्ग एक्स और गैर-सार्वजनिक वर्ग वाई है, तो संकलक दो फाइलें, X.class और Y.class बनाएगा।कक्षा लोडर परवाह नहीं है कि कक्षाएं सार्वजनिक हैं या नहीं, और यह कहने का कोई तरीका नहीं है कि वे एक ही फाइल से आए हैं या नहीं। –

+0

यह क्लास लोडर लुकअप प्रदर्शन को प्रभावित नहीं करता है। संकलित हो जाने के बाद, यह जानने के लिए प्रासंगिक नहीं है कि कक्षा किस स्रोत फ़ाइल से आती है। हालांकि कंपाइलर के लिए, अभी तक संकलित कक्षा वाई का संदर्भ संकलक को वर्तमान पैकेज के भीतर प्रत्येक * .java फ़ाइलों की जांच करने के लिए मजबूर करेगा (आमतौर पर, पैकेज की निर्देशिका की सभी स्रोत फ़ाइलें)। यह एक मामूली जानकारी है। – gawi

1

जावा classpath और उप निर्देशिकाओं में पैकेज पदानुक्रम के लिए स्कैनिंग से शुरुआत करते हुए वर्ग/इंटरफेस बाईटकोड खोजने के लिए इस सम्मेलन का इस्तेमाल करता है। इस पदानुक्रम के फाइल सिस्टम का प्रतिनिधित्व कुछ बुनियादी नियमों को भी लागू करता है।

  1. एक ही पैकेज में कोई भी दो जावा वर्गों या इंटरफेस एक ही नाम नहीं कर सकते हैं। फ़ाइल नाम संघर्ष होगा।
  2. में कोई भी दो जावा पैकेज एक ही मूल पैकेज का नाम नहीं हो सका। फ़ोल्डर पथ संघर्ष करेंगे।
  3. एक वर्ग संशोधन के बिना एक ही पैकेज में सभी वर्गों के लिए दृश्यता classpath गया है।
3

डॉ हाइन्ज़ Kabutz के सौजन्य और उनके उत्कृष्ट newsletter ....

क्यों है एक अलग फ़ाइल में प्रत्येक सार्वजनिक वर्ग?

यह एक सवाल है कि मेरे को अक्सर मेरे पाठ्यक्रमों के दौरान पूछा गया है। अब तक मेरे पास इस प्रश्न का अच्छा जवाब नहीं है। सेक्शन 1 में, हम पढ़ते हैं: "हालांकि प्रत्येक ओक संकलन इकाई में एकाधिक कक्षाएं या इंटरफेस हो सकते हैं, अधिकांश कक्षा या इंटरफ़ेस प्रति संकलन इकाई सार्वजनिक हो सकती है"।

साइडबार में यह बताता है कि क्यों: "यह प्रतिबंध अभी तक संकलक द्वारा लागू नहीं की है, हालांकि यह कुशल पैकेज आयात के लिए आवश्यक है"

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

2

हमारे पास किसी भी जावा संकलन इकाई (.java स्रोत फ़ाइल) में केवल एक शीर्ष स्तर के सार्वजनिक या इंटरफ़ेस हो सकते हैं।

लेकिन प्रति src फ़ाइल में डिफ़ॉल्ट कक्षाओं/इंटरफेस की कोई भी संख्या हो सकती है।

क्यों:

JLS जावा संकलक करने का विकल्प छोड़ देता है। और संकलक कार्यान्वयन के सबसे फ़ाइल नाम है करने के लिए मजबूर एक ही रूप में:

(1) सार्वजनिक वर्ग/इंटरफेस नाम

(2) एक मुख्य विधि और कोई सार्वजनिक वर्ग तो किसी भी नाम है, अगर वहाँ

(3) यदि मुख्य विधि और सार्वजनिक वर्ग है तो मुख्य विधि उस सार्वजनिक कक्षा

(4) में होनी चाहिए यदि कोई सार्वजनिक वर्ग नहीं है और कोई मुख्य विधि नहीं है तो कोई वैध नाम जो मेल हो सकता है या नहीं फ़ाइल में वर्ग/इंटरफ़ेस नाम।

से (2): यदि दो सार्वजनिक वर्गों की अनुमति है, तो हमें फ़ाइल को दो नाम देना चाहिए जो फाइल सिस्टम के लिए बहुत अर्थहीन है। से (3): यदि दो सार्वजनिक वर्गों की अनुमति है, तो हमारे पास दो मुख्य विधियां होनी चाहिए जो जावा

इसलिए जावा स्रोत फ़ाइल में केवल एक ही सार्वजनिक कक्षा हो सकती है।

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

स्रोत: मेरी रीडिंग और समझ।

0

मुझे लगता है कि यह एक संभावित कारण हो सकता है। जावा फ़ाइल में केवल एक सार्वजनिक वर्ग हो सकता है क्योंकि जावा फ़ाइल का नाम सार्वजनिक वर्ग के नाम के समान है। और जाहिर है कि हमारे पास दो अलग-अलग नामों वाली फ़ाइल नहीं हो सकती है।

0

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

1

इन प्रतिबंधों के पीछे मूल कारण को समझने के लिए, मान लीजिए कि संकलक नहीं करता है सार्वजनिक नाम के नाम के समान फ़ाइल नाम नामकरण के लिए संकलन त्रुटि दें।

मान लीजिए कि एक पैकेज

package A; 

class file1 
{ 
    public static void main(String args[]) 
    { 

    } 
} 

public class file3 
{ 
public static void main(String args[]) 
{ 

} 
} 

अब वहाँ एक

 A 
    / \ 
file1.java file2.java 

file1.java के रूप में हम जानते हैं कि एक सार्वजनिक वर्ग भी पैकेज के बाहर पहुँचा जा सकता है, अब यह हो जाएगा बाहरी दुनिया के लिए इसे सुलभ बनाने के लिए एक डेवलपर की ज़िम्मेदारी। चलो देखते हैं कि कैसे:

मान लीजिए पैकेज ए में केवल जावा फाइलें हैं (कोई क्लास फाइल नहीं है) और पैकेज के बाहर कुछ कक्षा एक सार्वजनिक वर्ग फ़ाइल 3 तक पहुंचने का प्रयास करती है, कंपाइलर पहले file3.class (उपलब्ध नहीं) खोजने का प्रयास करेगा, फिर यह file3.java (उपलब्ध नहीं) खोजने का प्रयास करेगा। तो भले ही फ़ाइल 3 वर्ग प्रकृति में सार्वजनिक है, यह बाहरी दुनिया के लिए दृश्यमान नहीं है। तो यदि एक कंपाइलर प्रतिबंध लगाता है कि यदि एक फ़ाइल में सार्वजनिक वर्ग है, तो इसे सार्वजनिक वर्ग के नाम के समान नाम दिया जाना चाहिए, फिर उपरोक्त मुद्दे को हल किया जा सकता है और डेवलपर को सार्वजनिक कक्षा को बाहरी दुनिया में उजागर करने के बारे में सोचना नहीं होगा ।

कंपाइलर भी प्रतिबंध लगाता है कि प्रति जावा फ़ाइल में लगभग एक सार्वजनिक कक्षा होनी चाहिए, ताकि प्रत्येक सार्वजनिक वर्ग को बाहरी दुनिया द्वारा एक्सेस किया जा सके।

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