CodeGym /جاوا بلاگ /Random-UR /جاوا میں ترمیم کرنے والوں تک رسائی حاصل کریں۔
John Squirrels
سطح
San Francisco

جاوا میں ترمیم کرنے والوں تک رسائی حاصل کریں۔

گروپ میں شائع ہوا۔
ہائے! آج کے سبق میں، ہم رسائی میں ترمیم کرنے والوں کے تصور سے واقف ہوں گے اور ان کے ساتھ کام کرنے کے طریقے کی مثالوں پر غور کریں گے۔ بلاشبہ، 'آشنا ہو جاؤ' کہنا بالکل درست نہیں ہے: آپ ان میں سے اکثر سے پچھلے اسباق سے پہلے ہی واقف ہیں۔ صرف اس صورت میں، آئیے سب سے اہم نکتے کی اپنی یادداشت کو تازہ کریں۔ موڈیفائر تک رسائی اکثر کلیدی الفاظ ہوتے ہیں جو آپ کے کوڈ کے مختلف حصوں تک رسائی کو منظم کرتے ہیں۔ 'اکثر' کیوں؟ کیونکہ ان میں سے ایک کلیدی لفظ کے استعمال کے بغیر بطور ڈیفالٹ سیٹ ہوتا ہے :) جاوا میں چار رسائی موڈیفائر ہیں۔ ہم ان کو سب سے زیادہ پابندی والے سے لے کر سب سے زیادہ نرمی والے تک درج کرتے ہیں:
  • نجی؛
  • پہلے سے طے شدہ (پیکیج نظر آتا ہے)؛
  • محفوظ
  • عوام.
آئیے ان میں سے ہر ایک پر ایک نظر ڈالیں اور شناخت کریں کہ وہ کب کارآمد ہو سکتے ہیں۔ اور ہم مثالیں دیں گے :)

نجی ترمیم کنندہ

ترمیم کرنے والوں تک رسائی۔  نجی، محفوظ، طے شدہ، عوامی - 2نجی رسائی میں سب سے زیادہ پابندی والا ترمیم کنندہ ہے۔ یہ ڈیٹا اور طریقوں کی مرئیت کو ایک ہی طبقے میں محدود کرتا ہے۔ آپ اس ترمیم کنندہ کو حاصل کرنے والوں اور سیٹرز کے بارے میں سبق سے جانتے ہیں۔ یہ مثال یاد ہے؟

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
ہم نے پچھلے سبق میں اس پر غور کیا تھا۔ ہم نے یہاں ایک سنگین غلطی کی: ہم اپنے ڈیٹا کو عوامی بناتے ہیں، جس سے ساتھی پروگرامرز کو فیلڈز تک براہ راست رسائی حاصل کرنے اور ان کی اقدار کو تبدیل کرنے کی اجازت ملتی ہے۔ مزید کیا ہے... یہ اقدار بغیر کسی چیک کے تفویض کی گئی تھیں۔ اس کا مطلب ہے کہ ہمارا پروگرام "" نام کی ایک بلی بنا سکتا ہے جس کی عمر -1000 سال اور وزن 0 ہے۔ اس مسئلے کو حل کرنے کے لیے، ہم نے گیٹرز اور سیٹرز کا استعمال کیا، اور ڈیٹا تک رسائی کو محدود کرنے کے لیے پرائیویٹ موڈیفائر کا بھی استعمال کیا۔

public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
بنیادی طور پر، فیلڈز تک رسائی کو محدود کرنا اور گیٹرز اور سیٹرز کو لاگو کرنا اس بات کی سب سے عام مثالیں ہیں کہ حقیقی کام میں نجی کو کس طرح استعمال کیا جائے گا۔ دوسرے لفظوں میں، اس موڈیفائر کا بنیادی مقصد کسی پروگرام میں encapsulation حاصل کرنا ہے۔ ویسے یہ صرف فیلڈز پر لاگو نہیں ہوتا ہے۔ تصور کریں کہ آپ کے پروگرام میں ایک طریقہ ہے جو کچھ بہت پیچیدہ فعالیت کو نافذ کرتا ہے۔ ہم مثال کے طور پر کیا تجویز کر سکتے ہیں؟ فرض کریں کہ آپ کا readDataFromCollider() طریقہ ڈیٹا ایڈریس کو ان پٹ کے طور پر قبول کرتا ہے، بائٹ فارمیٹ میں Large Hadron Collider سے ڈیٹا پڑھتا ہے، اس ڈیٹا کو ٹیکسٹ میں تبدیل کرتا ہے، اسے فائل میں لکھتا ہے، اور پرنٹ کرتا ہے۔ یہاں تک کہ طریقہ کار کی تفصیل بھی خوفناک لگتی ہے، کوڈ کے بارے میں کچھ نہیں کہنا :) کوڈ کو مزید پڑھنے کے قابل بنانے کے لیے، یہ بہتر ہوگا کہ طریقہ کار کی تمام پیچیدہ منطق کو ایک جگہ پر نہ لکھا جائے۔ اس کے بجائے، ہمیں فعالیت کو الگ الگ طریقوں میں توڑ دینا چاہیے۔ مثال کے طور پر، readByteData() طریقہ ڈیٹا کو پڑھنے کے لیے ذمہ دار ہے، convertBytesToSymbols() طریقہ کولائیڈر سے پڑھے گئے ڈیٹا کو ٹیکسٹ میں تبدیل کرتا ہے، saveToFile() طریقہ موصول شدہ ٹیکسٹ کو فائل میں محفوظ کرتا ہے، اور printColliderData() طریقہ ہمارے پرنٹ کرتا ہے۔ ڈیٹا فائل. آخر میں، ہمارا readDataFromCollider() طریقہ بہت آسان ہو جائے گا:

public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
تاہم، جیسا کہ آپ کو انٹرفیس کے بارے میں سبق یاد ہوگا، صارف کو صرف بیرونی انٹرفیس تک رسائی حاصل ہوتی ہے۔ اور ہمارے 4 طریقے اس کا حصہ نہیں ہیں۔ وہ مددگار طریقے ہیں: ہم نے انہیں کوڈ کی پڑھنے کی اہلیت کو بہتر بنانے اور چار مختلف کاموں کو ایک طریقہ میں نہ گھسیٹنے کے لیے بنایا ہے۔ آپ کو صارف کو ان طریقوں تک رسائی دینے کی ضرورت نہیں ہے۔ اگر collider کے ساتھ کام کرتے وقت صارفین کو convertBytesToSymbols() طریقہ تک رسائی حاصل ہے، تو وہ غالباً اس طریقہ سے الجھ جائیں گے اور حیران ہوں گے کہ یہ کس چیز کے لیے ہے۔ کون سے بائٹس کو تبدیل کیا جاتا ہے؟ وہ کہاں سے آئے؟ انہیں متن میں کیوں تبدیل کریں؟ اس طریقہ کار میں لاگو کی گئی منطق صارف کے سامنے آنے والے انٹرفیس کا حصہ نہیں ہے۔ صرف readDataFromCollider() طریقہ انٹرفیس کا حصہ ہے۔ تو ہم ان چار 'اندرونی' طریقوں کے ساتھ کیا کریں؟ ٹھیک ہے! ان تک رسائی کو محدود کرنے کے لیے پرائیویٹ موڈیفائر کا استعمال کریں ۔ ایسا کرنے سے وہ صارف کو الجھائے بغیر کلاس کے اندر اپنا کام پرامن طریقے سے انجام دے سکتے ہیں، جسے ہر انفرادی طریقہ کار کی منطق جاننے کی ضرورت نہیں ہے۔

public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

محفوظ ترمیم کنندہ

اگلا سب سے زیادہ پابندی والا ترمیم کنندہ محفوظ ہے ۔ محفوظترمیم کرنے والوں تک رسائی۔  نجی، محفوظ، طے شدہ، عوامی - 3 رسائی موڈیفائر کے ذریعہ نشان زد کردہ فیلڈز اور طریقے نظر آئیں گے:
  • ہمارے جیسے ہی پیکیج میں شامل تمام کلاسوں میں؛
  • ان تمام کلاسوں کے اندر جو ہماری کلاس کے وارث ہیں۔
شروع میں، یہ تصور کرنا مشکل ہے کہ اس کی کب ضرورت ہو گی۔ حیران نہ ہوں: پرائیویٹ کے مقابلے میں محفوظ کے لیے استعمال کے بہت کم کیسز ہیں ، اور وہ بہت مخصوص ہیں۔ تصور کریں کہ ہمارے پاس ایک AbstractSecretAgent خلاصہ کلاس ہے جو کچھ انٹیلی جنس سروس میں ایک خفیہ ایجنٹ کی نمائندگی کرتا ہے، اور ساتھ ہی ایک top_secret پیکیج جس میں اس طبقے اور اس کی اولاد شامل ہے۔ کنکریٹ کلاسز جیسے FBISecretAgent ، MI6SecretAgent ، MossadSecretAgent ، وغیرہ اسے وراثت میں حاصل کرتے ہیں۔ خلاصہ کلاس کے اندر، ہم ایک ایجنٹ کاؤنٹر کو نافذ کرنا چاہتے ہیں۔ یہ اس وقت بڑھے گا جب پروگرام میں کہیں نیا ایجنٹ بنایا جائے گا۔ پیکیج top_secret؛

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
لیکن ہمارے ایجنٹ خفیہ ہیں! اس کا مطلب یہ ہے کہ وہ اور کسی کو نہیں معلوم ہونا چاہئے کہ ان میں سے کتنے موجود ہیں۔ ہم آسانی سے agent_counter فیلڈ میں محفوظ موڈیفائر شامل کر سکتے ہیں۔ پھر ہمارے ٹاپ_سیکریٹ پیکیج میں موجود دیگر خفیہ ایجنٹ کی کلاسوں اور دیگر کلاسوں کی مثالیں اس کی قدر حاصل کر سکتی ہیں۔

public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
اور یہ اس قسم کا خصوصی کام ہے جس کے لیے محفوظ موڈیفائر کی ضرورت ہوتی ہے :)

پیکیج نظر آنے والا ترمیم کنندہ

فہرست میں اگلا ڈیفالٹ موڈیفائر ہے، جسے پیکیج ویزیبل موڈیفائر بھی کہا جاتا ہے ۔ یہ کسی کلیدی لفظ سے ظاہر نہیں ہوتا ہے، کیونکہ جاوا اسے تمام فیلڈز اور طریقوں پر بطور ڈیفالٹ لاگو کرتا ہے۔ اگر آپ اپنے کوڈ میں درج ذیل لکھتے ہیں:

int x = 10
x متغیر کے پاس اس پیکیج کی مرئی رسائی ہوگی۔ یہ یاد رکھنا آسان ہے کہ یہ کیا کرتا ہے۔ بنیادی طور پر، ڈیفالٹ = محفوظ شدہ وراثت :) محفوظ ترمیم کار کی طرح، اس کا اطلاق محدود ہے۔ اکثر، پہلے سے طے شدہ رسائی ایسے پیکیج میں استعمال ہوتی ہے جس میں کچھ یوٹیلیٹی کلاسز ہوتی ہیں جو پیکیج میں موجود دیگر تمام کلاسوں کی فعالیت کو نافذ نہیں کرتی ہیں۔ آئیے ایک مثال دیتے ہیں۔ تصور کریں کہ ہمارے پاس ایک 'سروسز' پیکج ہے۔ اس میں مختلف کلاسز ہیں جو ڈیٹا بیس کے ساتھ کام کرتی ہیں۔ مثال کے طور پر، ایک UserService کلاس ہے جو ڈیٹا بیس سے صارف کا ڈیٹا پڑھتی ہے، ایک CarService کلاس ہے جو ایک ہی ڈیٹابیس سے کار ڈیٹا پڑھتی ہے، اور دوسری کلاسیں، جن میں سے ہر ایک مخصوص قسم کی اشیاء کے ساتھ کام کرتا ہے اور ڈیٹا بیس سے متعلقہ ڈیٹا پڑھتا ہے۔

package services;

public class UserService {
}

package services;

public class CarService {
}
لیکن ڈیٹا بیس میں موجود ڈیٹا کے لیے ایک فارمیٹ میں ہونا آسان ہو گا اور ہمیں دوسرے فارمیٹ میں اس کی ضرورت ہے۔ تصور کریں کہ ڈیٹا بیس میں صارفین کی تاریخ پیدائش <TIMESTAMP WITH TIME ZONE> کے طور پر محفوظ ہے...

2014-04-04 20:32:59.390583+02
...اور اس کے بجائے ہمیں سب سے آسان چیز کی ضرورت ہے — ایک java.util.Date ۔ اس مسئلے کو حل کرنے کے لیے، سروسز پیکج کے اندر، ہم ایک خصوصی میپر کلاس بنا سکتے ہیں ۔ یہ ڈیٹا بیس سے ڈیٹا کو ہمارے مانوس جاوا اشیاء میں تبدیل کرنے کا ذمہ دار ہوگا۔ ایک سادہ مددگار کلاس۔ ہم عام طور پر تمام کلاسز کو پبلک کلاس کے طور پر قرار دیتے ہیں ClassName ، لیکن یہ کوئی ضرورت نہیں ہے۔ ہم اپنی مددگار کلاس کو صرف کلاس میپر کے طور پر قرار دے سکتے ہیں ۔ اس صورت میں، یہ اب بھی اپنا کام کرتا ہے، لیکن یہ سروسز پیکج سے باہر کسی کو نظر نہیں آتا !

package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
اور یہاں بنیادی استدلال ہے: پیکیج سے باہر کسی کو بھی مددگار کلاس کیوں دیکھنے کی ضرورت ہوگی جو صرف اس پیکیج میں موجود کلاسوں کے ساتھ کام کرتی ہو؟

عوامی ترمیم کنندہ

اور آخری لیکن کم از کم، عوامی ترمیم کنندہ! آپ اس ترمیم کنندہ سے CodeGym پر اپنے مطالعے کے پہلے دن اس وقت ملے جب آپ نے پہلی بار عوامی static void main(String[] args) چلایا تھا ۔ ترمیم کرنے والوں تک رسائی۔  نجی، محفوظ، طے شدہ، عوامی - 4اب جب کہ آپ انٹرفیس کے بارے میں سبق پڑھ چکے ہیں، اس کا مقصد آپ پر واضح ہے :) آخرکار، عوامی ترمیم کنندہ صارفین کو کچھ دینے کے لیے بنایا گیا تھا۔ مثال کے طور پر، آپ کے پروگرام کا انٹرفیس۔ فرض کریں کہ آپ نے ایک مترجم پروگرام لکھا ہے جو روسی متن کا انگریزی میں ترجمہ کر سکتا ہے۔ آپ نے ایک ترجمہ (String textInRussian) طریقہ بنایا ہے جو تمام ضروری منطق کو نافذ کرتا ہے۔ آپ نے اس طریقہ کو لفظ public کے ساتھ نشان زد کیا ، اور اب یہ انٹرفیس کا حصہ ہے:

public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
آپ اس طریقہ کو اسکرین پر موجود 'ترجمہ' بٹن کے ساتھ باندھ سکتے ہیں اور آپ کا کام ہو گیا! کوئی بھی اسے استعمال کر سکتا ہے۔ عوامی ترمیم کار کے ساتھ نشان زد کوڈ کے حصے آخری صارف کے لیے بنائے گئے ہیں۔ ایک حقیقی زندگی کی مثال فراہم کرتے ہوئے، پرائیویٹ ان تمام عملوں کے لیے ہے جو ٹی وی کے اندر ہوتے ہیں، لیکن پبلک ٹی وی کو منظم کرنے کے لیے استعمال ہونے والے ریموٹ کنٹرول کے بٹنوں کے لیے ہے۔ مزید یہ کہ صارف کو یہ جاننے کی ضرورت نہیں ہے کہ ٹیلی ویژن کیسے بنایا گیا ہے یا یہ کیسے کام کرتا ہے۔ ریموٹ کنٹرول عوامی طریقوں کا مجموعہ ہے: on() , off() , nextChannel() , previousChannel() , increaseVolume() , reduceVolume() وغیرہ۔ جو کچھ آپ نے سیکھا ہے اس کو تقویت دینے کے لیے، ہمارا مشورہ ہے کہ آپ اس سے ایک ویڈیو سبق دیکھیں۔ ہمارا جاوا کورس
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION