Theory
एक Folder में तेईस Files
BookBridge बढ़ गया है: Book, Member, Librarian, FineReceipt, IssueRegister, OverdueException, Reminder... एक folder में 23 files, और आपने अभी एक teammate की Report के बगल में Report नाम की एक दूसरी class add करने की कोशिश की।
एक library ने यह problem centuries पहले solve किया: labels वाले shelves। Fiction यहाँ, reference वहाँ, same-titled books अलग shelves पर peacefully रहती हैं।
Java का labelled shelf package है: related classes और interfaces का एक named group।
Theory
Shelf Declare करना
File के top पर एक line एक class को एक shelf पर रखती है:
package circulation;
public class IssueRegister { ... }
Exam check करने वाले rules:
- package statement file में पहला non-comment statement होना चाहिए, किसी भी import या class से पहले
- folder structure को name mirror करना चाहिए: circulation की classes एक
circulation/folder में रहती हैं;package com.bookbridge.utilcom/bookbridge/util/में रहता है - convention: package names lowercase होते हैं, अक्सर एक reversed domain (com.bookbridge) globally unique रहने के लिए
Practical
दो Files, दो Shelves
// file: circulation/IssueRegister.java
package circulation; // first statement, folder matches
public class IssueRegister {
public void note(String title) {
System.out.println("Issued: " + title);
}
}
// file: BookBridge.java (default package, for the demo)
import circulation.IssueRegister; // single-type import
public class BookBridge {
public static void main(String[] args) {
IssueRegister r = new IssueRegister();
r.note("Let Us C");
}
}
Theory
एक Shelved Class तक पहुँचने के तीन तरीके
एक बार IssueRegister circulation में रहने लगे, बाकी code के पास 3 access routes हैं:
- Single-Type Import:
import circulation.IssueRegister;फिर short name इस्तेमाल कीजिए। Precise, self-documenting, preferred। - On-Demand Import:
import circulation.*;उस package की सारी classes available बनाता है। Convenient, पर छुपाता है names कहाँ से आते हैं। - Fully Qualified Name, कोई import नहीं:
circulation.IssueRegister r = new circulation.IssueRegister();Verbose; useful जब 2 packages दोनों एक Report offer करते हैं और आपको दोनों चाहिए।
Quiz
import java.util.*; एक file के top पर है। कौन सा statement TRUE है?
- java.util की सारी classes AND इसके subpackages जैसे java.util.regex import होते हैं
- सिर्फ़ java.util के अंदर directly वाली classes import होती हैं; subpackages नहीं
- पूरी class library अब imported है, तो program run time पर slower compile होता है
- यह एक compile error है; star form exist नहीं करता
Show the answer
सिर्फ़ java.util के अंदर directly वाली classes import होती हैं; subpackages नहीं
Star exactly एक level तक पहुँचता है: java.util की खुद की classes। Subpackages अलग packages हैं; java.util.regex को अपनी खुद की import line चाहिए। यही trap है जिसमें option A जाता है, और यह constantly पूछा जाता है। Option C एक myth को double करता है: imports एक compile-time naming convenience हैं और कोई run-time cost add नहीं करते। Option D एक form को deny करता है जो आप पहले ही इस्तेमाल कर चुके हैं। याद रखिए: star का मतलब है इस shelf की books, पूरी wing नहीं।
Think first
वह Import जो आपने कभी नहीं लिखा
String, System, Math: आपने lesson 1 से इन्हें कहीं भी import statement के बिना इस्तेमाल किया है। Tap करने से पहले: वे क्यों काम करते हैं?
Show the answer
वे java.lang में रहते हैं, वह एक package जो Java हर file में automatically import करता है, exactly इसलिए क्योंकि कोई program इसके बिना survive नहीं करता। बाकी सब कुछ पूछना चाहिए: Scanner java.util में बैठता है, तो keyboard input import java.util.Scanner; से शुरू होता है। Exam one-liner: java.lang default से imported है; बाकी सारे packages को एक explicit import या एक fully qualified name चाहिए।
Watch out
जहाँ Package Files टूटते हैं
Misplaced Package Statement: package circulation; से पहले कोई भी statement (एक import भी) एक compile error है। Order हमेशा: package, फिर imports, फिर class।
Folder Mismatch: package circulation; declare करना जब file कहीं और बैठी है compile होता है, फिर run time पर NoClassDefFoundError से मर जाता है; JVM circulation/IssueRegister.class ढूँढता है और कुछ नहीं पाता। javac -d . से compile कीजिए और folder tree आपके लिए build हो जाता है।
Theory
आप पूरे Semester import कर रहे हैं
यहाँ कुछ भी foreign नहीं है: java.util, java.io और friends बस Sun की shelves हैं, reverse-domain convention से named, domain shortened away के साथ। BookBridge अब pros को mirror करता है: desk classes के लिए circulation, month-end के लिए reports। अगला lesson natural follow-up पूछता है: shelving ACCESS का क्या करता है? Unit 2 का वह default no-modifier level, package-private, आख़िरकार अपना purpose दिखाने वाला है।
Summary
Key takeaways
- एक package related classes का एक named group है; membership package name; से declare कीजिए file के पहले statement की तरह।
- Folders dotted name mirror करते हैं: com.bookbridge.util com/bookbridge/util/ में रहता है।
- Names lowercase हैं, conventionally reverse-domain uniqueness के लिए।
- तीन access routes: single-type import, on-demand import (package.*), या fully qualified names।
- Star एक package की classes import करता है, कभी इसके subpackages नहीं।
- सिर्फ़ java.lang auto-imported है: String और System बिना import काम करते हैं।
- Memory hook: package shelf label करता है, import आपको full address ज़ोर से पढ़ने से बचाता है।