CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ مقرر ڪيل قدر: حتمي، مستقل، ۽ غير تبديل ٿيندڙ
John Squirrels
سطح
San Francisco

جاوا ۾ مقرر ڪيل قدر: حتمي، مستقل، ۽ غير تبديل ٿيندڙ

گروپ ۾ شايع ٿيل
سلام توھان اڳي ئي واقف آھيو لفظ "موڊيفائر" سان. گھٽ ۾ گھٽ، توھان ڏٺو آھي پھچائي موڊيفائر (عوامي، خانگي) ۽ جامد موڊيفائر. اڄ اسان هڪ خاص ترميم ڪندڙ تي بحث ڪنداسين جنهن کي فائنل سڏيو ويندو آهي . توھان چئي سگھوٿا فائنل موڊيفير ”سيمينٽس“ اسان جي پروگرام جا حصا جتي مسلسل، غير واضح، غير تبديل ٿيندڙ رويي جي ضرورت آھي. توھان جي پروگرامن ۾ ٽي جڳھون آھن جيڪي توھان استعمال ڪري سگھو ٿا: ڪلاس، طريقا، ۽ متغير. جاوا ۾ مقرر ڪيل قدر: فائنل، مستقل، ۽ ناقابل بدلائي - 2 اچو ته انهن جي ذريعي ترتيب ڏيو. جيڪڏهن حتمي ترميم ڪندڙ طبقي جي اعلان ۾ استعمال ٿئي ٿي، ان جو مطلب آهي ته ڪلاس وارث نه ٿي سگهي. پوئين سبقن ۾، اسان هڪ سادي وراثت جو مثال استعمال ڪيو: اسان وٽ هڪ Animalوالدين ڪلاس ۽ ٻه ٻار طبقا هئا: Cat۽Dog

public class Animal {
}



public class Cat extends Animal {
   // Fields and methods of the Cat class
}


public class Dog extends Animal {

   // Fields and methods of the Dog class
}
بهرحال، جيڪڏهن اسان ڪلاس تي حتميAnimal ترميم ڪندڙ استعمال ڪريون ٿا ، Cat۽ Dogطبقن ان کي وارث نٿا ڪري سگهن.

public final class Animal {

}

public class Cat extends Animal {

   // Error! Cannot inherit from final Animal
}
مرتب ڪندڙ فوري طور تي هڪ غلطي پيدا ڪري ٿو. جاوا ۾، ڪيترائي فائنل ڪلاس اڳ ۾ ئي لاڳو ڪيا ويا آھن. انهن مان جيڪي توهان اڪثر استعمال ڪندا آهيو، Stringسڀ کان وڌيڪ مشهور آهي. ان کان علاوه، جيڪڏهن ڪنهن طبقي کي حتمي قرار ڏنو وڃي ، ته ڪلاس جا سڀئي طريقا به حتمي ٿي ويندا . هن جو مطلب ڇا آهي؟ جيڪڏهن هڪ طريقو حتمي ترميم ڪندڙ کي استعمال ڪندي قرار ڏنو ويو آهي، ته توهان ان طريقي کي ختم نٿا ڪري سگهو. مثال طور، هتي اسان وٽ هڪ Animalڪلاس آهي جيڪو هڪ speak()طريقو بيان ڪري ٿو. پر، ڪتا ۽ ٻليون ضرور "ڳالهائي" مختلف طريقن سان. تنهن ڪري، اسان ڳالهائينداسين () طريقن ٻنهي Cat۽ Dogطبقن ۾، پر اسين انهن کي مختلف طريقي سان لاڳو ڪنداسين.

public class Animal {
  
   public void speak() {
       System.out.println("Hello!");
   }
}

public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}
اسان بنايو Cat۽ Dogطبقن کي والدين طبقي ۾ بيان ڪيل طريقي کي ختم ڪري ڇڏيو. هاڻي، هڪ جانور مختلف انداز سان ڳالهائيندو، ان تي منحصر آهي ته ڪهڙي قسم جي اعتراض آهي:

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       Dog dog = new Dog();
      
       cat.speak();
       dog.speak();
   }
}
ٻاھر نڪتو: ميوو! ووف! بهرحال، جيڪڏهن اسان Animalڪلاس جي speak()طريقي کي حتمي قرار ڏيون ٿا، ته پوءِ اسين ان کي ٻين ڪلاسن ۾ اوور رائڊ نٿا ڪري سگهون:

public class Animal {

   public final void speak() {
       System.out.println("Hello!");
   }
}


public class Cat extends Animal {

   @Override
   public void speak() {// Error! A final method can't be overridden!
       System.out.println("Meow!");
   }
}
۽ اسان جي شين کي استعمال ڪرڻ تي مجبور ڪيو ويندو speak()طريقو جيئن والدين طبقي ۾ بيان ڪيو ويو آهي:

public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   cat.speak();
   dog.speak();
}
آئوٽ: هيلو! سلام! هاڻي، حتمي متغير جي حوالي سان. انهن کي مستقل طور پڻ سڃاتو وڃي ٿو . پهريون (۽ سڀ کان وڌيڪ اهم)، شروعاتي قيمت هڪ مستقل قيمت تي لڳايو ويو آهي تبديل نه ٿي ڪري سگھجي. اهو هڪ ڀيرو ۽ سڀني لاء مقرر ڪيو ويو آهي.

public class Main {
  
   private static final int CONSTANT_EXAMPLE = 333;

   public static void main(String[] args) {

       CONSTANT_EXAMPLE = 999;// Error! You can't assign a new value to a final variable!
   }
}
هڪ مستقل کي فوري طور تي شروع ڪرڻ جي ضرورت ناهي. اهو بعد ۾ ڪري سگهجي ٿو. پر، شروعاتي طور تي مقرر ڪيل قيمت هميشه لاء ساڳيو رهندو.

public static void main(String[] args) {

   final int CONSTANT_EXAMPLE;

   CONSTANT_EXAMPLE = 999;// This is allowed
}
ٻيو، اسان جي متغير جو نالو نوٽ ڪريو. جاوا ۾ مستقل لاءِ مختلف نالو ڏيڻ جو رواج آهي. اهو معمولي اٺ ڪيس نوٽيشن ناهي . جيڪڏهن اهو هڪ عام متغير هجي ها، ته اسان ان کي سڏين ها constantExample . پر، مستقل جا نالا سڀني ڪيپ ۾ لکيل آھن، لفظن جي وچ ۾ انڊر اسڪور سان (جيڪڏھن ھڪڙو لفظ کان وڌيڪ ھجي)، مثال طور "CONSTANT_EXAMPLE". ڇو اسان کي مسلسل ضرورت آهي؟ اهي ڏاڍا ڪارآمد آهن جيڪڏهن، مثال طور، هڪ مقرر ڪيل قيمت آهي جيڪا توهان باقاعده پروگرام ۾ استعمال ڪندا آهيو. مثال طور، توهان تاريخ ٺاهڻ جو فيصلو ڪيو آهي ۽ پنهنجي طرفان راند "The Witcher 4" لکڻ جو فيصلو ڪيو آهي. راند واضح طور تي باقاعدي طور تي فلم جي نالي جو نالو استعمال ڪندي: "Geralt of Rivia". هي اسٽرنگ (۽ ٻين هيروز جا نالا) بهترين طور تي هڪ مستقل طور قرار ڏنو ويو آهي: ان جي قيمت هڪ جاءِ تي محفوظ ڪئي ويندي، ۽ ان کي هڪ لک ڀيرا داخل ڪرڻ وقت توهان کي ٽائپو ضرور نه ٿيندو.

public class TheWitcher4 {

   private static final String GERALT_NAME = "Geralt of Rivia";
   private static final String YENNEFER_NAME = "Yennefer of Wengerberg";
   private static final String TRISS_NAME = "Triss Merigold";

   public static void main(String[] args) {

       System.out.println("The Witcher 4");
       System.out.println("It's already the fourth Witcher game, but " + GERALT_NAME + " still can't decide who" +
               " he likes more: " + YENNEFER_NAME + " or " + TRISS_NAME);

       System.out.println("But, if you've never played The Witcher before, we'll start from the beginning.");
       System.out.println("The protagonist's name is " + GERALT_NAME);
       System.out.println(GERALT_NAME + " is a witcher, a monster hunter");
   }
}
آئوٽ پُٽ: دي وِچر 4 اها اڳ ۾ ئي چوٿين وِچر گيم آهي، پر ريويا جو گيرالٽ اڃا تائين اهو فيصلو نه ڪري سگهيو آهي ته هو ڪير وڌيڪ پسند ڪري ٿو: ينيفر آف وينگربرگ يا ٽريس ميريگولڊ پر، جيڪڏهن توهان اڳي ڪڏهن به دي وِچر کي نه کيڏيو آهي، اسان شروع ڪنداسين شروعات اصلي ڪردار جو نالو ريويا جو Geralt آهي Rivia جو Geralt is a witcher, a monster hunter اسان هيروز جي نالن کي مستقل طور قرار ڏنو آهي. هاڻي اسان ضرور ٽائپو نه ڪنداسين، ۽ هر وقت انهن کي هٿ سان لکڻ جي ڪا ضرورت ناهي. ٻيو پلس: جيڪڏهن اسان کي پوري پروگرام ۾ متغير جي قيمت کي تبديل ڪرڻ جي ضرورت آهي، ته توهان ان کي هڪ جڳهه تي ڪري سگهو ٿا، بجاءِ دستي طور تي ان کي پوري ڪوڊ بيس ۾ تبديل ڪرڻ جي. :)

ناقابل بدلائي قسمون

جئين توهان جاوا سان ڪم ڪيو آهي، توهان شايد اڳ ۾ ئي استعمال ڪيو آهي اهو خيال آهي ته پروگرامرز تقريبن سڀني شين جي حالت تي مڪمل ڪنٽرول آهن. جيڪڏهن توهان هڪ اعتراض ٺاهڻ چاهيو ٿا Cat، توهان ڪري سگهو ٿا. جيڪڏھن توھان ان کي تبديل ڪرڻ چاھيو ٿا، توھان ڪري سگھو ٿا. جيڪڏهن توهان چاهيو ٿا ته ان جي عمر يا ٻيو ڪجهه تبديل ڪريو، توهان ڪري سگهو ٿا. پر جاوا وٽ ڪيترائي ڊيٽا جا قسم آھن جن وٽ ھڪڙي خاص ملڪيت آھي. اهي ناقابل بدل آهن . جيڪڏهن ڪو طبقو بدلجي نٿو سگهي، ته ان جي شين جي حالت تبديل نه ٿي ڪري سگهجي. ڪجھ مثال چاھيو ٿا؟ اهو شايد توهان کي حيران ڪري سگهي ٿو، پر سڀ کان وڌيڪ مشهور غير معمولي طبقو آهي String! تنهن ڪري، اسان واقعي هڪ اسٽرنگ جي قيمت کي تبديل نٿا ڪري سگهون؟ خير، اچو ته ڪوشش ڪريون:

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   str1 = "I love Python";// but changing str1 has no impact on str2
   System.out.println(str2);// str2 continues to point to the "I love Java" string, but str1 now points to a different object
}
آئوٽ: مون کي جاوا پسند آهي مون کي جاوا پسند آهي اسان جي لکڻ کان پوءِ

str1 = "I love Python";
string "I love Java"اعتراض تبديل يا ڪٿي به نه ويو. اهو اڃا تائين خوشيء سان موجود آهي ۽ ساڳئي متن اڳ وانگر آهي. ڪوڊ

str1 = "I love Python";
بس هڪ ٻيو اعتراض ٺاهيو، جيڪو str1 هاڻي اشارو ڪري ٿو. پر، اسان کي ”مون کي جاوا پيار آهي“ اسٽرنگ اعتراض تي ڪو به اثر نظر نٿو اچي. چڱو، اچو ته ٻيو ڪجهه ڪوشش ڪريون! ڪلاس Stringطريقن سان ڀريل آهي، ۽ انهن مان ڪجهه ظاهر ڪن ٿا اعتراض جي حالت کي تبديل ڪرڻ لاء! مثال طور، اتي هڪ replace()طريقو آهي. اچو ته لفظ "جاوا" کي "پٿون" ۾ تبديل ڪريون اسان جي تار ۾!

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   str1.replace("Java", "Python");// We try to change the state of str1 by swapping the word "Java" with "Python"
   System.out.println(str2);
}
ٻاھر نڪتو: مون کي جاوا پسند آھي مون کي جاوا پسند آھي اھو وري ڪم نه ڪيو! ٿي سگهي ٿو متبادل جو طريقو ڪم نٿو ڪري؟ اچو ته ٻيو ڪجهه ڪوشش ڪريون. مثال طور، substring(). اهو دليلن جي طور تي منظور ڪيل ڪردار جي اشارن جي بنياد تي هڪ ذيلي اسٽرينگ واپس ڪري ٿو. اچو ته اسان جي اسٽرنگ جي پهرين 10 اکرن کي ڪٽي ڇڏيون:

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   str1.substring(10);// Truncate the original String 
   System.out.println(str2);
}
ٻاھر نڪتو: مون کي جاوا پسند آھي مون کي جاوا پسند آھي جاوا ۾ مقرر ڪيل قدر: حتمي، مستقل، ۽ ناقابل بدلائي - 3 ڪجھ به نه بدليو. ۽ اهو نه هجڻ گهرجي. جيئن اسان اڳ ۾ چيو آهي، اسٽرنگ ناقابل قابل آهن. تنهن ڪري، ڪلاس ۾ سڀني طريقن سان ڇا آهي String؟ سڀ کان پوء، اهي تارن کي ٽوڙي سگهن ٿا، ڪردارن کي تبديل ڪري سگھن ٿا، ۽ وڌيڪ. جيڪڏهن ڪجهه به نه ٿيو ته ڪهڙو فائدو؟ اهي اصل ۾ اهي شيون ڪري سگهن ٿا! پر، اهي هر وقت هڪ نئين اسٽرنگ واپس آڻيندا آهن. لکڻ بي معنيٰ آهي

str1.replace("Java", "Python");
ڇاڪاڻ ته توهان اصل اعتراض کي تبديل نه ٿا ڪري سگهو. پر، جيڪڏهن توهان طريقي جي نتيجن کي نئين ريفرنس متغير ڏانهن لکندا، توهان کي فوري طور تي فرق نظر ايندو!

public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;// Both reference variables point to the same string.
   System.out.println(str2);

   String str1AfterReplacement =  str1.replace("Java", "Python");
   System.out.println(str2);

   System.out.println(str1AfterReplacement);
}
سڀ Stringطريقا هن طريقي سان ڪم ڪن ٿا. شيءِ کي ڪجهه به نه ٿو ٿي سگهي "I love Java". توهان صرف هڪ نئين شئي ٺاهي سگهو ٿا ۽ لکي سگهو ٿا: "<new object> = تبديل ڪرڻ جو نتيجو "I love Java" object ". ٻيون ڪهڙيون قسمون ناقابل تبديلي آهن؟ ڪجهه جيڪي توهان کي فوري طور تي ياد رکڻ جي ضرورت پوندي اهي آهن سڀ لفافي طبقن جي ابتدائي قسمن لاءِ Integer. Byte, Character, Short, Boolean, Long, Double, Float: اهي سڀئي طبقا immutableشيون ٺاهيندا آهن (اسان انهن بابت ايندڙ سبقن ۾ ڳالهائينداسين). هن ۾ شامل ڪلاس شامل آهن جيڪي وڏي انگ ٺاهڻ لاءِ استعمال ڪيا ويندا آهن، جهڙوڪ BigInteger۽ BigDecimal. اسان تازو ئي استثنا کي ڍڪيو آهي ۽ اسٽيڪ ٽريس تي ڇڪيو آهي . اندازو لڳايو ته ڇا، java.lang.StackTraceElement شيون به ناقابل تبديليون آهن. اهو سمجھ ۾ اچي ٿو: جيڪڏهن ڪو اسان جي اسٽيڪ جي ڊيٽا کي تبديل ڪري سگهي ٿو، اهو سڄو شيء بيڪار بڻائيندو. تصور ڪريو ته ڪو ماڻهو اسٽيڪ ٽريڪ ذريعي وڃي رهيو آهي ۽ هڪ OutOfMemoryError کي FileNotFoundException ۾ تبديل ڪري ٿو . ۽ پوءِ توھان ان اسٽيڪ کي استعمال ڪريو نقص جو سبب ڳولڻ لاءِ. پر پروگرام فائلن کي به استعمال نه ڪندو آھي. :) سو، انھن شين کي غير مٽائي، صرف صورت ۾ . , ڇو ڪنهن کي ضرورت پوندي Strings کي ناقابل بدلائڻ؟ انهن جي قدرن کي تبديل ڪرڻ هڪ مسئلو ڇو هوندو؟ اهو شايد اڃا به وڌيڪ آسان هوندو. :/ ان جا ڪيترائي سبب آهن. پهرين، اهو ياداشت بچائيندو آهي. غير مٽائيندڙ تارن کي اسٽرنگ پول ۾ رکي سگھجي ٿو ، تارن کي نئين ٺاهڻ بدران ٻيهر استعمال ڪرڻ جي اجازت ڏئي ٿو. ٻيو، سيڪيورٽي لاء. مثال طور، صارف نام ۽ پاسورڊ لڳ ڀڳ هر پروگرام ۾ اسٽرنگ آهن. انهن کي تبديل ڪرڻ ممڪن بڻائڻ جي نتيجي ۾ اختياري مسئلا ٿي سگهن ٿا. ٻيا به سبب آهن، پر جاوا بابت اسان جي مطالعي اڃا تائين انهن کي ڍڪي نه ڇڏيو آهي، تنهنڪري اسان انهن کي بعد ۾ واپس آڻينداسين.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION