JavaRush /جاوا بلاگ /Random-SD /رسائي تبديل ڪندڙ. پرائيويٽ، محفوظ، ڊفالٽ، عوامي

رسائي تبديل ڪندڙ. پرائيويٽ، محفوظ، ڊفالٽ، عوامي

گروپ ۾ شايع ٿيل
سلام! اڄ جي ليڪچر ۾ اسان ” پهچ مٽائيندڙن “ جي تصور کان واقف ٿينداسين ۽ انهن سان ڪم ڪرڻ جا مثال ڏسنداسين. رسائي تبديل ڪندڙ.  خانگي، محفوظ، ڊفالٽ، عوامي - 1جيتوڻيڪ لفظ "اچو واقف ٿي وڃو" مڪمل طور تي درست نه ٿيندو: توهان اڳئين ليڪچرن مان انهن مان اڪثر کان واقف آهيو. بس صورت ۾، اچو ته اصلي شيء بابت اسان جي ياداشت کي تازو ڪريون. رسائي تبديل ڪندڙ اڪثر لفظ آهن جيڪي توهان جي ڪوڊ جي مختلف حصن تائين رسائي جي سطح کي منظم ڪن ٿا. ڇو "اڪثر ڪري"؟ ڇاڪاڻ ته انهن مان هڪ ڊفالٽ طور تي مقرر ڪيو ويو آهي ۽ هڪ لفظ طرفان اشارو نه ڪيو ويو آهي :) جاوا ۾ ڪل چار رسائي موڊيفائرز آهن. اسان انهن کي ترتيب ڏيون ٿا سڀ کان وڌيڪ سخت کان سڀ کان وڌيڪ "نرم" تائين:
  • خانگي؛
  • محفوظ ٿيل؛
  • ڊفالٽ (پيڪيج نظر اچي ٿو)؛
  • عوامي
اچو ته انهن مان هر هڪ کي ڏسو، فيصلو ڪريو جڏهن اهي اسان لاء ڪارائتو ٿي سگهن ٿا ۽ مثال ڏيو :)

تبديل ڪندڙ نجي

رسائي تبديل ڪندڙ.  پرائيويٽ، محفوظ، ڊفالٽ، عوامي - 2Private- سڀ کان وڌيڪ محدود رسائي موڊيفائر. اهو هڪ واحد طبقي اندر ڊيٽا ۽ طريقن جي نمائش کي محدود ڪري ٿو. توھان ڄاڻو ٿا ھن ترميمي کي ليڪچر مان حاصل ڪندڙن ۽ سيٽرز بابت. ڇا توهان کي اهو مثال ياد آهي؟
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 جي وزن سان. هن مسئلي کي حل ڪرڻ لاء، اسان استعمال ٿيل getters ۽ setters ، ۽ پڻ ڊيٽا تائين محدود رسائي هڪ موڊيفائر استعمال ڪندي private.
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) {
       // checking the input parameter
       this.name = name;
   }

   public int getAge() {
       return age;
   }

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

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // checking the input parameter
       this.weight = weight;
   }
}
دراصل، فيلڊز تائين رسائي کي محدود ڪرڻ ۽ حاصل ڪرڻ وارن کي لاڳو ڪرڻ privateحقيقي ڪم ۾ استعمال جو سڀ کان عام مثال آهي. اهو آهي، هڪ پروگرام ۾ 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) {

       // convert bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // save the read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // print data from file
   }
}
بهرحال، جيئن توهان کي ياد آهي ته ليڪچر کان انٽرفيس تي، صارف صرف فائنل انٽرفيس تائين رسائي حاصل ڪري ٿو. ۽ اسان جا 4 طريقا ان جو حصو نه آهن. اهي مددگار آهن : اسان انهن کي ڪوڊ پڙهڻ جي صلاحيت کي بهتر بڻائڻ ۽ چار مختلف ڪمن کي هڪ طريقي سان ڇڪڻ کان بچڻ لاءِ ٺاهيو آهي. استعمال ڪندڙ کي انهن طريقن تائين رسائي ڏيڻ جي ڪا ضرورت ناهي. جيڪڏهن ڪو استعمال ڪندڙ کي ان طريقي تائين رسائي آهي جڏهن هڪ ڪليڊر سان ڪم ڪري رهيو آهي convertBytesToSymbols()، هو گهڻو ڪري اهو سمجهي نه سگهندو ته هي طريقو ڇا آهي ۽ ان جي ضرورت ڇو آهي. ڪهڙا بائيٽ تبديل ڪيا ويا آهن؟ اهي ڪٿان آيا؟ انهن کي متن ۾ ڇو تبديل ڪيو؟ منطق جيڪا هن طريقي ۾ هلندي آهي صارف انٽرفيس جو حصو ناهي. صرف طريقو readDataFromCollider()انٽرفيس جو حصو آهي. انهن چئن "اندروني" طريقن سان ڇا ڪجي؟ ساڄو! انهن تائين رسائي کي محدود ڪريو تبديل ڪندڙ سان private. هن طريقي سان اهي آساني سان پنهنجو ڪم ڪلاس جي اندر ڪري سگهن ٿا ۽ صارف کي پريشان نه ڪن، جن کي انهن مان هر هڪ جي منطق جي الڳ الڳ ضرورت ناهي.
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) {
       // convert bytes to characters
   }

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

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

ترميم ڪندڙ محفوظ

ايندڙ سڀ کان وڌيڪ محدود رسائي موڊيفائر آهي protected. رسائي تبديل ڪندڙ.  خانگي، محفوظ، ڊفالٽ، عوامي - 3 فيلڊز ۽ طريقا نامزد ٿيل رسائي موڊيفائر سان protectedنظر ايندا:
  • سڀني طبقن ۾ جيڪي اسان جي ساڳي پيڪيج ۾ آهن؛
  • اسان جي طبقي جي سڀني جانشين طبقن ۾.
اهو فوري طور تي تصور ڪرڻ ڏکيو آهي جڏهن هن جي ضرورت هجي. حيران نه ٿيو: protectedايپليڪيشن جا تمام گهٽ ڪيس آهن private، ۽ اهي مخصوص آهن. تصور ڪريو ته اسان وٽ هڪ خلاصو طبقو آهي AbstractSecretAgentجيڪو ڪنهن ڳجهي ايجنسي جي ڳجهي ايجنٽ کي ظاهر ڪري ٿو، انهي سان گڏ هڪ پيڪيج top_secretجنهن ۾ هن طبقي ۽ ان جي اولاد شامل آهن. ڪنڪريٽ طبقن - FBISecretAgent، MI6SecretAgentوغيره MossadSecretAgent- ان مان ورثي ۾ مليا آهن. خلاصي طبقي جي اندر اسان هڪ ايجنٽ ڪائونٽر کي لاڳو ڪرڻ چاهيون ٿا. جڏهن پروگرام ۾ هڪ نئون ايجنٽ اعتراض پيدا ٿئي ٿو، اهو وڌندو.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
پر اسان جا ايجنٽ راز آهن! هن جو مطلب اهو آهي ته صرف انهن کي ۽ ٻيو ڪو به انهن جي تعداد بابت ڄاڻڻ نه گهرجي. protectedاسان آساني سان فيلڊ ۾ تبديل ڪندڙ شامل ڪري سگھون ٿا agentCount، ۽ پوءِ يا ته ٻين ڳجھي ايجنٽ طبقن جون شيون، يا اھي طبقا جيڪي اسان جي ”راز“ پيڪيج ۾ موجود آھن، ان جي قيمت حاصل ڪري سگھون ٿا top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
اهو اهڙن مخصوص ڪمن لاءِ آهي ته هڪ ترميمي جي ضرورت آهي protected:)

پيڪيج ڏسڻ ۾ تبديلي آڻيندڙ

اسان جي لسٽ تي اڳيون تبديل ڪندڙ آھي defaultيا، جيئن اھو پڻ سڏيو ويندو آھي، package visible. اهو هڪ لفظ طرفان ظاهر نه ڪيو ويو آهي ڇاڪاڻ ته اهو سڀني شعبن ۽ طريقن لاءِ جاوا ۾ ڊفالٽ طور مقرر ڪيو ويو آهي. جيڪڏهن توهان پنهنجي ڪوڊ ۾ لکندا آهيو -
int x = 10;
... variable xبه ساڳي پهچ هوندي package visible. جيڪڏهن هڪ طريقو (يا متغير) ڪنهن به ترميمي سان نشان لڳل نه آهي، اهو سمجهيو ويندو آهي "ڊفالٽ موڊيفائر" سان نشان لڳل. متغير يا طريقن سان اهڙي تبديلي آڻيندڙ (يعني بغير ڪنهن کان سواءِ) پيڪيج جي سڀني طبقن لاءِ نظر اچن ٿا جن ۾ اهي اعلان ڪيا ويا آهن. ۽ صرف انهن کي. ان جا استعمال محدود آھن، جھڙوڪ تبديل ڪندڙ protected. گهڻو ڪري، default-access هڪ پيڪيج ۾ استعمال ڪيو ويندو آهي جتي ڪجهه يوٽيلٽي ڪلاس آهن جيڪي هن پيڪيج ۾ ٻين سڀني طبقن جي ڪارڪردگي تي عمل نه ڪندا آهن. اچو ته هڪ مثال ڏيو. تصور ڪريو اسان وٽ ھڪڙو " سروسز " پيڪيج آھي. ان جي اندر مختلف طبقا آهن جيڪي ڊيٽابيس سان ڪم ڪن ٿا. مثال طور، ھڪڙو طبقو آھي 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. هن مقصد لاء، اسان پيڪيج اندر servicesهڪ خاص ڪلاس ٺاهي سگهون ٿا Mapper. هو ڊيٽابيس مان ڊيٽا کي جاوا شين ۾ تبديل ڪرڻ جو ذميوار هوندو جن سان اسان واقف آهيون. هڪ سادي مددگار ڪلاس. اسان عام طور تي سڀني طبقن کي ٺاهيندا آهيون public class ClassName، پر اهو ضروري ناهي. اسان صرف اسان جي مددگار طبقي جو اعلان ڪري سگھون ٿا class Mapper. انهي حالت ۾، اهو اڃا تائين پنهنجو ڪم ڪري ٿو، پر ڪنهن کي ڏسڻ ۾ نٿو اچي ته پيڪيج کان ٻاهر services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
۽ اهو، حقيقت ۾، صحيح منطق آهي: ڇو ڪو ماڻهو پيڪيج کان ٻاهر هڪ معاون ڪلاس ڏسي ٿو جيڪو صرف ساڳئي پيڪيج جي طبقن سان ڪم ڪري ٿو؟

عوامي ترميم ڪندڙ

۽ لسٽ تي آخري، پر گهٽ ۾ گهٽ نه - تبديل ڪندڙ public! توهان هن سان جاوا رش ۾ پڙهائي جي پهرين ڏينهن تي ملاقات ڪئي، لانچ ڪيو public static void main(String[] args). رسائي تبديل ڪندڙ.  خانگي، محفوظ، ڊفالٽ، عوامي - 4 هاڻي ته توهان انٽرفيس جي باري ۾ ليڪچر جو اڀياس ڪيو آهي، ان جو مقصد توهان لاءِ واضح آهي :) آخرڪار، publicاهو ٺاهيو ويو آهي صارفين کي ڪجهه ڏيڻ لاءِ. مثال طور، توهان جي پروگرام جو انٽرفيس. اچو ته توهان هڪ ترجمو ڪندڙ پروگرام لکيو آهي، ۽ اهو روسي متن کي انگريزي ۾ ترجمو ڪري سگهي ٿو. توھان ھڪڙو طريقو ٺاھيو آھي translate(String textInRussian)جنھن ۾ ضروري منطق تي عمل ڪيو ويندو آھي. توھان ھن طريقي کي لفظ سان نشان لڳايو public، ۽ ھاڻي اھو انٽرفيس جو حصو بڻجي ويندو:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
توهان پروگرام جي اسڪرين تي "ترجمو" بٽڻ سان هن طريقي سان هڪ ڪال جوڙي سگهو ٿا - ۽ بس! ڪو به ان کي استعمال ڪري سگهي ٿو. ڪوڊ جا حصا تبديل ڪندڙ سان نشان publicلڳل آھن آخري استعمال ڪندڙ لاءِ. زندگيءَ مان هڪ مثال ڏيان ته privateٽي وي جي اندر جڏهن اهو ڪم ڪري رهيو آهي ته اهي سڀ عمل آهن ۽ publicاهي ٽي وي ريموٽ ڪنٽرول جا بٽڻ آهن جن سان صارف ان کي ڪنٽرول ڪري سگهي ٿو. ساڳئي وقت، هن کي اهو ڄاڻڻ جي ضرورت ناهي ته ٽي وي ڪيئن ڪم ڪندو آهي ۽ ڪيئن ڪم ڪندو آهي. ريموٽ ڪنٽرول - publicطريقن جو هڪ سيٽ آهي: on(), off(), nextChannel(), previousChannel(), increaseVolume(), decreaseVolume()etc.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION