JavaRush /جاوا بلاگ /Random-SD /جاوا 8 ۾ ڊفالٽ طريقا: اهي ڇا ڪري سگهن ٿا ۽ نٿا ڪري سگهن؟
Spitfire
سطح

جاوا 8 ۾ ڊفالٽ طريقا: اهي ڇا ڪري سگهن ٿا ۽ نٿا ڪري سگهن؟

گروپ ۾ شايع ٿيل
اپريل 2014 ۾ پيٽر وراس پاران لکيل مضمون جو ترجمو . جاوا 8 ۾ ڊفالٽ طريقا: اهي ڇا ڪري سگهن ٿا ۽ نٿا ڪري سگهن؟  - 1مترجم کان: اصطلاح " ڊفالٽ طريقو " صرف جاوا ۾ ظاهر ٿيو آهي ۽ مون کي پڪ ناهي ته ان لاءِ روسي ۾ ڪو قائم ڪيل ترجمو آهي. مان اصطلاح استعمال ڪندس "ڊفالٽ طريقو"، جيتوڻيڪ مان نه ٿو سمجهان ته اهو مثالي آهي. مان توهان کي وڌيڪ ڪامياب ترجمي تي بحث ڪرڻ جي دعوت ڏيان ٿو.

ڊفالٽ طريقو ڇا آهي

هاڻي، جاوا 8 جي ڇڏڻ سان، توهان انٽرفيس ۾ نوان طريقا شامل ڪري سگهو ٿا ته جيئن انٽرفيس انهن طبقن سان مطابقت رکي جيڪي ان کي لاڳو ڪن ٿيون. اهو تمام ضروري آهي جيڪڏهن توهان هڪ لائبريري ٺاهي رهيا آهيو جيڪا ڪيترن ئي پروگرامرن طرفان ڪيوف کان نيو يارڪ تائين استعمال ڪئي ويندي آهي. جاوا 8 کان اڳ، جيڪڏهن توهان لائبريري ۾ هڪ انٽرفيس جي وضاحت ڪئي هئي، ته توهان ان ۾ طريقا شامل نه ڪري سگهو ٿا بغير ڪنهن خطري جي ته توهان جي انٽرنيٽ تي هلندڙ ڪجهه ايپليڪيشن ٽوڙي ويندي جڏهن ان کي اپڊيٽ ڪيو ويندو. تنهن ڪري، جاوا 8 ۾ توهان هاڻي هن کان ڊڄي نه ٿا سگهو؟ نه توهان نٿا ڪري سگهو. انٽرفيس ۾ ڊفالٽ طريقو شامل ڪرڻ شايد ڪجھ طبقن کي ناقابل استعمال بڻائي سگھي ٿو. اچو ته پھريون سٺيون شيون ڊفالٽ طريقن بابت ڏسو. جاوا 8 ۾، طريقو سڌو سنئون انٽرفيس ۾ لاڳو ڪري سگھجي ٿو. (هاڻي انٽرفيس ۾ جامد طريقا به لاڳو ڪري سگھجن ٿا، پر اها ٻي ڪهاڻي آهي.) هڪ انٽرفيس ۾ لاڳو ڪيل طريقي کي ڊفالٽ ميٿڊ چئبو آهي، ۽ ان کي ڊفالٽ ڪي ورڊ مان ظاهر ڪيو ويندو آهي . جيڪڏهن هڪ طبقو هڪ انٽرفيس کي لاڳو ڪري ٿو، اهو ڪري سگهي ٿو، پر ان جي ضرورت ناهي، انٽرفيس ۾ لاڳو ڪيل طريقن کي لاڳو ڪرڻ. ڪلاس کي ڊفالٽ لاڳو ڪرڻ ورثي ۾ ملي ٿو. اهو ئي سبب آهي ته اهو ضروري ناهي ته طبقن کي تبديل ڪيو وڃي جڏهن اهي انٽرفيس کي تبديل ڪن ٿا.

گھڻن وراثت؟

شيون وڌيڪ پيچيده ٿي وينديون آهن جيڪڏهن هڪ ڪلاس هڪ کان وڌيڪ (چئو، ٻه) انٽرفيس لاڳو ڪري ٿو، ۽ اهي ساڳيا ڊفالٽ طريقو لاڳو ڪن ٿا. ڪهڙو طريقو ڪلاس کي ورثي ۾ ملندو؟ جواب ڪو نه آهي. انهي صورت ۾، طبقي کي لازمي طريقي سان عمل ڪرڻ گهرجي (يا ته سڌو سنئون يا ڪنهن ٻئي طبقي کان وراثت ۾). صورتحال ساڳي آهي جيڪڏهن صرف هڪ انٽرفيس وٽ ڊفالٽ طريقو آهي، ۽ ٻئي ۾ ساڳيو طريقو خلاصو آهي. جاوا 8 ڪوشش ڪري ٿو نظم و ضبط ۽ مبهم حالتن کان پاسو ڪرڻ. جيڪڏهن طريقن کي هڪ کان وڌيڪ انٽرفيس ۾ بيان ڪيو ويو آهي، پوء ڪو به ڊفالٽ عمل درآمد طبقي طرفان وراثت ۾ نه آهي - توهان کي هڪ تاليف جي غلطي ملندي. جيتوڻيڪ، توهان کي تاليف جي غلطي حاصل نه ٿي سگھي جيڪڏهن توهان جو ڪلاس اڳ ۾ ئي مرتب ٿيل آهي. جاوا 8 هن سلسلي ۾ ڪافي مضبوط نه آهي. ان جا سبب آهن، جن تي مان بحث ۾ وڃڻ نٿو چاهيان (مثال طور: جاوا رليز اڳي ئي جاري ٿي چڪو آهي ۽ بحث جو وقت گهڻو گذري چڪو آهي ۽ عام طور تي، هي انهن لاءِ جڳهه ناهي).
  • اچو ته توهان وٽ ٻه انٽرفيس آهن ۽ هڪ ڪلاس انهن ٻنهي کي لاڳو ڪري ٿو.
  • انٽرفيس مان ھڪڙو ڊفالٽ طريقو ايم () لاڳو ڪري ٿو.
  • توهان سڀني انٽرفيس ۽ ڪلاس کي گڏ ڪريو.
  • توھان ھڪڙو انٽرفيس تبديل ڪريو جنھن ۾ m() طريقو نه آھي ان کي خلاصي طريقي جي طور تي بيان ڪندي.
  • توهان صرف تبديل ٿيل انٽرفيس کي گڏ ڪريو.
  • ڪلاس شروع ڪريو.
جاوا 8 ۾ ڊفالٽ طريقا: اهي ڇا ڪري سگهن ٿا ۽ نٿا ڪري سگهن؟  - 2انهي حالت ۾، ڪلاس ڪم ڪري ٿو. توھان ان کي اپڊيٽ ٿيل انٽرفيس سان گڏ نه ٿا ڪري سگھو، پر اھو پراڻن ورزن سان گڏ ڪيو ويو آھي ۽ تنھنڪري ڪم ڪري ٿو. هاڻي
  • abstract m() طريقي سان انٽرفيس کي تبديل ڪريو ۽ ڊفالٽ لاڳو ڪرڻ شامل ڪريو.
  • تبديل ٿيل انٽرفيس کي گڏ ڪريو.
  • ڪلاس هلائڻ: غلطي.
جڏهن اتي ٻه انٽرفيس آهن جيڪي هڪ طريقي جي ڊفالٽ عمل درآمد مهيا ڪن ٿا، اهو طريقو ڪنهن طبقي ۾ نه ٿو سڏيو وڃي جيستائين اهو خود طبقي طرفان لاڳو نه ڪيو وڃي (ٻيهر، يا ته پاڻ تي يا ڪنهن ٻئي طبقي کان وراثت ۾). جاوا 8 ۾ ڊفالٽ طريقا: اهي ڇا ڪري سگهن ٿا ۽ نٿا ڪري سگهن؟  - 3ڪلاس سان مطابقت. اهو هڪ تبديل ٿيل انٽرفيس سان لوڊ ڪري سگهجي ٿو. اهو شايد هلائي سگھي ٿو جيستائين هڪ طريقو سڏيو وڃي ٿو جيڪو ٻنهي انٽرفيس ۾ ڊفالٽ عمل درآمد آهي.

مثال ڪوڊ

جاوا 8 ۾ ڊفالٽ طريقا: اهي ڇا ڪري سگهن ٿا ۽ نٿا ڪري سگهن؟  - 4مٿي بيان ڪرڻ لاءِ، مون C.java ڪلاس لاءِ هڪ ٽيسٽ ڊاريڪٽري ۽ 3 سب ڊاريڪٽري ٺاهي I1.java ۽ I2.java فائلن ۾ انٽرفيس لاءِ. ٽيسٽ لاءِ روٽ ڊاريڪٽري C.java ڪلاس لاءِ سورس ڪوڊ تي مشتمل آهي. بنيادي ڊاريڪٽري ۾ انٽرفيس جو ھڪڙو نسخو شامل آھي جيڪي ٺاھڻ ۽ ٺاھڻ لاءِ موزون آھن: انٽرفيس I1 وٽ ڊفالٽ طريقو آھي m(); I2 انٽرفيس اڃا تائين ڪو به طريقو ناهي. ڪلاس ۾ ھڪڙو طريقو آھي mainتنھنڪري اسان ان کي جانچڻ لاءِ عمل ڪري سگھون ٿا. اهو چيڪ ڪري ٿو ته ڪي ڪمانڊ لائن دليل آهن، تنهنڪري اسان ان کي آساني سان عمل ڪري سگهون ٿا يا ته ڪال ڪرڻ کان سواءِ m().
~/github/test$ cat C.java
public class C implements I1, I2 {
  public static void main(String[] args) {
    C c = new C();
    if( args.length == 0 ){
      c.m();
    }
  }
}
~/github/test$ cat base/I1.java
public interface I1 {
  default void m(){
    System.out.println("hello interface 1");
  }
}
~/github/test$ cat base/I2.java
public interface I2 {
}
توھان ڪمانڊ لائن مان ڪلاس کي گڏ ڪري سگھوٿا.
~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1
مطابقت رکندڙ ڊاريڪٽري ۾ I2 انٽرفيس جو ھڪڙو نسخو شامل آھي جيڪو m() طريقي جو خلاصو بيان ڪري ٿو، ۽ پڻ، ٽيڪنيڪل سببن جي ڪري، I1.java جي اڻ سڌريل ڪاپي.
~/github/test$ cat compatible/I2.java

public interface I2 {
  void m();
}
اهڙي سيٽ کي سي ڪلاس گڏ ڪرڻ لاءِ استعمال نٿو ڪري سگهجي:
~/github/test$ javac -cp .:compatible C.java
C.java:1: error: C is not abstract and does not override abstract method m() in I2
public class C implements I1, I2 {
       ^
1 error
غلطي جو پيغام بلڪل صحيح آهي. تنهن هوندي، اسان وٽ اڳئين تاليف مان C.class آهي ۽، جيڪڏهن اسان انٽرفيس کي مطابقت واري ڊاريڪٽري ۾ گڏ ڪريون ٿا، اسان وٽ ٻه انٽرفيس هوندا جيڪي اڃا تائين ڪلاس هلائڻ لاءِ استعمال ڪري سگهجن ٿا:
~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1
ٽيون ڊاريڪٽري - wrong- ورزن I2 تي مشتمل آهي، جيڪو پڻ طريقو بيان ڪري ٿو m():
~/github/test$ cat wrong/I2.java
public interface I2 {
  default void m(){
    System.out.println("hello interface 2");
  }
}
توهان کي تاليف بابت پريشان ٿيڻ جي ضرورت ناهي. جيتوڻيڪ طريقو ٻه ڀيرا اعلان ڪيو ويو آهي، ڪلاس اڃا تائين استعمال ڪري سگهجي ٿو ۽ هلائي سگهجي ٿو جيستائين m() طريقو سڏيو وڃي. اھو اھو آھي جيڪو اسان کي ڪمانڊ لائن دليل جي ضرورت آھي:
~/github/test$ javac wrong/*.java
~/github/test$ java -cp .:wrong C
Exception in thread "main" java.lang.IncompatibleClassChangeError: Conflicting default methods: I1.m I2.m
    at C.m(C.java)
    at C.main(C.java:5)
~/github/test$ java -cp .:wrong C x
~/github/test$

نتيجو

جڏهن توهان پنهنجي لائبريري جاوا 8 ڏانهن پورٽ ڪيو ۽ پنهنجي انٽرفيس کي تبديل ڪريو ڊفالٽ طريقن کي شامل ڪرڻ لاءِ، توهان کي شايد ڪو مسئلو نه هوندو. گهٽ ۾ گهٽ، اهو آهي ته جاوا 8 لائبريري ڊولپرز اميد ڪري رهيا آهن جيئن اهي ڪارڪردگي شامل ڪن. توهان جي لائبريري استعمال ڪندي ايپليڪيشنون اڃا تائين جاوا 7 لاءِ استعمال ڪري رهيون آهن، جتي ڪي به ڊفالٽ طريقا نه آهن. جيڪڏهن ڪيتريون ئي لائبريريون گڏجي استعمال ڪيون وڃن، اتي تڪرار جو امڪان آهي. ان کان بچڻ لاء ڪيئن؟ پنھنجي لائبريري جي API کي ساڳي طرح ٺاھيو جيئن اڳي. ڊفالٽ طريقن جي صلاحيتن تي ڀروسو ڪندي مطمئن نه ٿيو. اهي هڪ آخري رستو آهن. ٻين انٽرفيس سان ٽڪراءَ کان بچڻ لاءِ احتياط سان نالا چونڊيو. اچو ته ڏسون ته ڪيئن ترقي ڪندي جاوا لاءِ هي فيچر استعمال ڪندي.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION