Access modifiers classes، methods، اور fields کی visibility کو کنٹرول کرتے ہیں — یعنی کون انہیں access کر سکتا ہے۔ یہ encapsulation کے پیچھے کا میکانزم ہیں۔ Java میں چار سطحیں ہیں، سب سے زیادہ restrictive سے لے کر کم سے کم restrictive تک۔
چار سطحیں
public class Example {
public int a; // accessible from ANYWHERE
protected int b; // same package + SUBCLASSES (even in other packages)
int c; // package-private (DEFAULT, no keyword) — same package only
private int d; // accessible ONLY within THIS class
}
Visibility کی ٹیبل
Modifier Same class Same package Subclass (other pkg) Everywhere
────────────────────────────────────────────────────────────────────────
public ✓ ✓ ✓ ✓
protected ✓ ✓ ✓ ✗
(default) ✓ ✓ ✗ ✗
private ✓ ✗ ✗ ✗
نوٹ: modifier کو چھوڑ دینے سے package-private (default) ملتا ہے — صرف اسی package میں نظر آتا ہے۔ یہ ایک الگ سطح ہے، public جیسی نہیں ہے۔
یہ کیسے encapsulation کو ممکن بناتے ہیں
public class BankAccount {
private double balance; // hidden — protect the data
public void deposit(double amt) { // public API — controlled access
if (amt > 0) balance += amt;
}
public double getBalance() { // read-only access to private data
return balance;
}
}
// outside code CANNOT do account.balance = -1000 (it's private)
معیاری pattern: fields کو private بنائیں اور controlled public methods سے expose کریں۔ یہ invariants کو محفوظ رکھتا ہے اور آپ کو internal representation کو تبدیل کرنے کی آزادی دیتا ہے بغیر callers کو توڑے — یہ encapsulation کا جوہر ہے۔
عملی رہنمائی
✓ Fields → private (almost always); expose via methods if needed
✓ Public API methods → public
✓ Internal helpers → private
✓ For subclasses to access/override → protected
✓ Classes → public (usable anywhere) or package-private (internal to a module)
اصول: سب سے restrictive modifier استعمال کریں جو کام کرے (least privilege) — private سے شروع کریں اور صرف ضرورت کے مطابق کھولیں۔
اس سے کیوں فرق پڑتا ہے
Access modifiers یہ ہیں کہ کیسے Java encapsulation لاگو کرتا ہے — OOP کا بنیادی اصول جو internal details چھپاتا ہے اور controlled interfaces expose کرتا ہے۔
صحیح modifier منتخب کرنا (fields کے لیے private سے شروع کریں، صرف intended API کے لیے public) data integrity کو محفوظ رکھتا ہے، external code کو internals پر منحصر ہونے سے روکتا ہے (تاکہ آپ آزادی سے refactor کر سکیں)، اور class کے intended usage کو واضح کرتا ہے۔
تمام چار سطحوں کو سمجھنا — خاص طور پر اکثر فراموش کی جانے والی package-private default اور subclass-spanning protected — اچھی طرح encapsulated، maintainable classes اور APIs کو design کرنے کے لیے ضروری ہے، اور یہ کنٹرول کرنے کے لیے کہ آپ کے کتنے کوڈ کو باقی system میں expose کیا جائے۔
