Theory
वह Helper जिसे Backstage रहना चाहिए
circulation package के अंदर आप FineTable लिखते हैं, एक small helper जो days-late को rupees में map करता है। यह plumbing है: अगर reports package (आपके teammate का code) इसे directly call करना शुरू करे, आपका हर change उसकी month-end report तोड़ देगा।
आप चाहते हैं FineTable हर circulation class के लिए usable हो और बाकी सबके लिए invisible।
Unit 2 का वह mysterious no-modifier access level याद है, "पूरा package" की तरह defined? यह वह lesson है जहाँ यह अपनी living earn करता है।
Theory
एक Package के अंदर क्या रहता है
एक package के contents हैं:
- classes (Book, IssueRegister, FineTable)
- interfaces (Printable, Payable)
- exception classes (OverdueException: यह भी एक class है)
- subpackages (circulation.fines), जो अलग packages हैं जो बस name prefix share करते हैं
Exam weight वाला एक physical rule: एक public class को exactly अपने नाम की file में declared होना चाहिए (public class IssueRegister सिर्फ़ IssueRegister.java में), और एक file में ज़्यादा से ज़्यादा एक public class हो सकती है।
At a glance
Access Levels, दूसरे Package से देखे गए
| Member Marked | Same Package इसे देखता है? | दूसरा Package इसे देखता है? |
|---|---|---|
| private | No (सिर्फ़ own class) | No |
| (default, कोई modifier नहीं) | Yes | No |
| protected | Yes | सिर्फ़ इसकी subclasses |
| public | Yes | Yes |
Practical
Default से Backstage
// file: circulation/FineTable.java
package circulation;
class FineTable { // no 'public': package-private CLASS
static int fineFor(int daysLate) {
return daysLate * 2; // Rs 2 per late day
}
}
// file: circulation/ReturnDesk.java
package circulation;
public class ReturnDesk { // the package's public face
public int settle(int daysLate) {
return FineTable.fineFor(daysLate); // same package: fine
}
}
// In package reports, both lines below would be COMPILE ERRORS:
// circulation.FineTable.fineFor(3); class not visible
// new circulation.FineTable(); class not visible
Quiz
class Helper { } (कोई modifier नहीं) package circulation में बैठता है। Package reports में code new circulation.Helper(); try करता है। क्या होता है?
- काम करता है: fully qualified name access rules bypass कर देता है
- Compile error: एक default-access class अपने package के बाहर invisible है
- काम करता है, पर सिर्फ़ Helper के public members usable हैं
- Constructor execute होने पर runtime exception
Show the answer
Compile error: एक default-access class अपने package के बाहर invisible है
CLASS पर कोई modifier नहीं का मतलब है package-private: बाकी हर package के लिए, Helper बस exist नहीं करता, और compiler यही कहता है। Option A वह tempting myth है जिसे यह question kill करता है: एक fully qualified name एक address है, key नहीं; यह कभी access control override नहीं करता। Option C को पहले class खुद visible होना चाहिए। Option D बहुत देर से है: Java के हर access violation की तरह, यह compile time पर मरता है।
Think first
दो Reports, कोई Fight नहीं
आपका circulation package और आपके teammate का reports package दोनों Summary नाम की एक class declare करते हैं। Tap करने से पहले: क्या project अभी भी compile होता है, और Java इन्हें कैसे अलग बताता है?
Show the answer
यह happily compile होता है। एक class का real name इसका fully qualified name है: circulation.Summary और reports.Summary पूरी तरह अलग names हैं जो बस alike खत्म होते हैं, जैसे Riya नाम की 2 students surname से distinguish होती हैं। यह packages namespaces की तरह act कर रहे हैं, access control के अलावा वे क्यों exist करते हैं इसका दूसरा बड़ा reason। एक file जिसे दोनों एक साथ चाहिए वह किसी को import नहीं करती और पूरे names लिखती है।
Watch out
जहाँ Package Access लोगों को Surprise करता है
Class पर public भूल जाना: अंदर सब कुछ public हो सकता है, पर अगर CLASS default है, कोई दूसरा package इसमें से कुछ भी touch नहीं कर सकता। जब एक import mysteriously fail हो, पहले class के अपने modifier को check कीजिए।
Packages के आर-पार protected: एक protected member दूसरे package तक सिर्फ़ एक subclass के अंदर पहुँचता है। वहाँ unrelated classes कुछ नहीं देखतीं; और Java का protected अभी भी पूरा home package include करता है, BCA304 के C++ rule से wider।
Theory
Boundary के साथ Design कीजिए
Professional Java package line deliberately इस्तेमाल करता है: shelf के front की तरह कुछ public classes (ReturnDesk), helpers इनके पीछे package-private छोड़े गए (FineTable)। Plumbing freely बदलिए; outsiders इस पर कभी depend नहीं हुए। यही Unit 2 का encapsulation है एक class से एक पूरे shelf तक scaled up। आख़िरी package lesson पूछता है machinery run time पर इन सारे shelves को कैसे FIND करती है: folders, classpath, और Package object।
Summary
Key takeaways
- एक package classes, interfaces, exception classes और subpackages contain करता है।
- Default (no-modifier) access = package-private: package के अंदर हर जगह visible, बाहर invisible।
- एक default-access CLASS दूसरे packages से unusable है, इसके members चाहे कुछ भी कहें।
- public class Name को Name.java में रहना चाहिए; per file एक public class।
- protected = पूरा home package + दूसरे packages में subclasses।
- 2 packages में same class name fine है: fully qualified names real names हैं।
- Memory hook: package shelf है; no-modifier का मतलब है staff only।