CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ برابر طريقو: بهترين طريقا
John Squirrels
سطح
San Francisco

جاوا ۾ برابر طريقو: بهترين طريقا

گروپ ۾ شايع ٿيل
سلام اڄ اسان جاوا ۾ ٻن اهم طريقن بابت ڳالهائينداسين: equals() ۽ hashCode() . هي پهريون ڀيرو نه آهي جڏهن اسان انهن سان مليا آهيون: CodeGym ڪورس برابر () جي باري ۾ هڪ مختصر سبق سان شروع ٿئي ٿو - ان کي پڙهو جيڪڏهن توهان ان کي وساري ڇڏيو آهي يا اڳ نه ڏٺو آهي... اڄ جي سبق ۾، اسان ' انهن تصورن بابت تفصيل سان ڳالهائينداسين. ۽ مون کي يقين رکو، اسان وٽ ڪجهه ڳالهائڻ آهي! پر ان کان اڳ جو اسان نئين طرف وڃون، اچو ته ريفريش ڪريون جيڪي اسان اڳي ئي ڍڪي چڪا آھيون :) جيئن توھان کي ياد آھي، عام طور تي == آپريٽر استعمال ڪندي ٻن شين جو مقابلو ڪرڻ خراب خيال آھي، ڇاڪاڻ ته == حوالن جو مقابلو ڪري ٿو. هتي اسان جو مثال آهي ڪارن سان گڏ هڪ تازي سبق مان: برابر ۽ هيش ڪوڊ طريقا: بهترين طريقا - 1
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car car1 = new Car();
       car1.model = "Ferrari";
       car1.maxSpeed = 300;

       Car car2 = new Car();
       car2.model = "Ferrari";
       car2.maxSpeed = 300;

       System.out.println(car1 == car2);
   }
}
ڪنسول آئوٽ:

false
اهو لڳي ٿو ته اسان ٻه هڪجهڙا ڪار شيون ٺاهيا آهن: ٻن ڪار جي شين جي لاڳاپيل شعبن جا قدر ساڳيا آهن، پر مقابلي جو نتيجو اڃا به غلط آهي. اسان اڳ ۾ ئي سبب ڄاڻون ٿا: ڪار 1 ۽ ڪار 2 حوالا مختلف ميموري ايڊريس ڏانهن اشارو ڪن ٿا، تنهنڪري اهي برابر نه آهن. پر اسان اڃا تائين ٻن شين جو مقابلو ڪرڻ چاهيون ٿا، نه ٻه حوالا. شين جي مقابلي لاءِ بهترين حل آهي equals() طريقو.

equals() طريقو

توهان کي ياد هوندو ته اسان اهو طريقو شروع کان نه ٺاهيو آهي، بلڪه اسان ان کي اوور رائڊ ڪريون ٿا: equals() طريقو Object class ۾ بيان ڪيو ويو آهي . اهو چيو ته، ان جي معمولي شڪل ۾، اهو ٿورو استعمال جو آهي:
public boolean equals(Object obj) {
   return (this == obj);
}
هي ڪيئن آهي equals() طريقو Object class ۾ بيان ڪيو ويو آهي . هي هڪ ڀيرو ٻيهر حوالن جو هڪ مقابلو آهي. هنن ائين ڇو ڪيو؟ خير، ٻوليءَ جي تخليق ڪندڙن کي ڪيئن خبر پوندي ته توهان جي پروگرام ۾ ڪهڙيون شيون برابر آهن ۽ ڪهڙيون نه؟ :) هي برابر () طريقي جو بنيادي نقطو آهي - هڪ طبقي جو خالق اهو آهي جيڪو اهو طئي ڪري ٿو ته ڪهڙن خاصيتن کي استعمال ڪيو ويندو آهي جڏهن طبقي جي شين جي برابري کي جانچيو وڃي. پوءِ توھان اوور رائڊ ڪيو equals() طريقو پنھنجي ڪلاس ۾. جيڪڏھن توھان سمجھ ۾ نه ٿا اچن ته "ڪھڙي خصوصيت جو تعين ڪري ٿو" جو مطلب، اچو ته ھڪڙو مثال ڏيو. ھتي ھڪڙو سادو طبقو آھي جيڪو ھڪڙو ماڻھو نمائندگي ڪري ٿو: Man.
public class Man {

   private String noseSize;
   private String eyesColor;
   private String haircut;
   private boolean scars;
   private int dnaCode;

public Man(String noseSize, String eyesColor, String haircut, boolean scars, int dnaCode) {
   this.noseSize = noseSize;
   this.eyesColor = eyesColor;
   this.haircut = haircut;
   this.scars = scars;
   this.dnaCode = dnaCode;
}

   // Getters, setters, etc.
}
فرض ڪريو اسان هڪ پروگرام لکي رهيا آهيون جنهن کي اهو طئي ڪرڻ جي ضرورت آهي ته ٻه ماڻهو هڪجهڙا جاڙا آهن يا صرف هڪجهڙا آهن. اسان وٽ پنج خاصيتون آهن: نڪ جي ماپ، اکين جو رنگ، وارن جو انداز، داغ جي موجودگي، ۽ ڊي اين اي ٽيسٽ جا نتيجا (سادگي لاءِ، اسان ان کي انٽيجر ڪوڊ طور پيش ڪندا آهيون). انهن خاصيتن مان ڪهڙيون خاصيتون توهان جي خيال ۾ اسان جي پروگرام کي هڪجهڙائي واري ٽوئن جي سڃاڻپ ڪرڻ جي اجازت ڏين ٿيون؟ برابر ۽ هيش ڪوڊ طريقا: بهترين طريقا - 2يقينا، صرف هڪ ڊي اين اي ٽيسٽ ضمانت فراهم ڪري سگهي ٿي. ٻن ماڻهن جي اکين جو رنگ، وار ڪٽڻ، نڪ ۽ حتي جا نشان به هڪجهڙا ٿي سگهن ٿا - دنيا ۾ تمام گهڻا ماڻهو آهن، ۽ اها گارنٽي ڏيڻ ناممڪن آهي ته اتي ڪو به ڊاپلگينگر نه آهي. پر اسان کي هڪ قابل اعتماد ميکانيزم جي ضرورت آهي: صرف ڊي اين اي ٽيسٽ جو نتيجو اسان کي صحيح نتيجو ڏيڻ جي اجازت ڏيندو. اسان جي طريقي جي لاء هي ڇا مطلب آهي equals()؟ اسان کي ڪلاس ۾ ان کي ختم ڪرڻ جي ضرورت آهي Man، اسان جي پروگرام جي ضرورتن کي مدنظر رکندي. طريقي کي int dnaCodeٻن شين جي فيلڊ جو مقابلو ڪرڻ گهرجي. جيڪڏهن اهي برابر آهن، ته شيون برابر آهن.
@Override
public boolean equals(Object o) {
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
ڇا اهو واقعي ايترو سادو آهي؟ سچي نه. اسان ڪجهه نظرانداز ڪيو. اسان جي شين لاء، اسان صرف هڪ فيلڊ جي سڃاڻپ ڪئي آهي جيڪو اعتراض جي برابري قائم ڪرڻ سان لاڳاپيل آهي: dnaCode. هاڻي تصور ڪريو ته اسان وٽ 1 نه، پر 50 لاڳاپيل شعبا آهن. ۽ جيڪڏھن ٻن شين جا سڀ 50 شعبا برابر آھن ته پوءِ شيون برابر آھن. اهڙو منظر پڻ ممڪن آهي. بنيادي مسئلو اهو آهي ته 50 شعبن جي مقابلي سان برابري قائم ڪرڻ هڪ وقت ساز ۽ وسيلن جي گنجائش وارو عمل آهي. ھاڻي تصور ڪريو ته اسان جي ڪلاس کان علاوه Man، اسان وٽ ھڪڙو Womanطبقو آھي جنھن ۾ بلڪل ساڳيا شعبا موجود آھن Man. جيڪڏهن ٻيو پروگرامر اسان جي طبقن کي استعمال ڪري ٿو، هو آساني سان هن طرح ڪوڊ لکي سگهي ٿو:
public static void main(String[] args) {

   Man man = new Man(........); // A bunch of parameters in the constructor

   Woman woman = new Woman(.........); // The same bunch of parameters.

   System.out.println(man.equals(woman));
}
انهي صورت ۾، فيلڊ جي قيمتن کي جانچڻ بيڪار آهي: اسان آساني سان ڏسي سگهون ٿا ته اسان وٽ ٻه مختلف طبقن جون شيون آهن، تنهنڪري ڪو به طريقو ناهي ته اهي برابر ٿي سگهن! هن جو مطلب آهي ته اسان کي طريقي سان چيڪ شامل ڪرڻ گهرجي equals()، مقابلي واري شين جي طبقن جي مقابلي ۾. اهو سٺو آهي ته اسان اهو سوچيو!
@Override
public boolean equals(Object o) {
   if (getClass() != o.getClass()) return false;
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
پر شايد اسان ڪجهه وساري ڇڏيو آهي؟ هيم... گهٽ ۾ گهٽ، اسان کي جانچڻ گهرجي ته اسان ڪنهن شئي جو پاڻ سان مقابلو نه ڪري رهيا آهيون! جيڪڏهن حوالا A ۽ B ساڳئي ميموري ايڊريس ڏانهن اشارو ڪن ٿا، پوء اهي ساڳيا اعتراض آهن، ۽ اسان کي وقت ضايع ڪرڻ ۽ 50 شعبن جو مقابلو ڪرڻ جي ضرورت ناهي.
@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (getClass() != o.getClass()) return false;
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
ان لاءِ چيڪ شامل ڪرڻ ۾ به ڏک نه ٿو ٿئي null: ڪابه شئي برابر نه ٿي سگهي null. تنهن ڪري، جيڪڏهن طريقو پيٽرولر نيل آهي، پوء اضافي چيڪن ۾ ڪو به نقطو ناهي. ذهن ۾ هن سڀني سان، پوء ڪلاس equals()لاء اسان جو طريقو Manهن طرح نظر اچي ٿو:
@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (o == null || getClass() != o.getClass()) return false;
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
اسان مٿي ذڪر ڪيل سڀني ابتدائي چيڪن کي انجام ڏيون ٿا. ڏينهن جي آخر ۾، جيڪڏهن:
  • اسان هڪ ئي طبقي جي ٻن شين جو مقابلو ڪري رهيا آهيون
  • ۽ مقابلي واريون شيون ساڳيون شيون نه آهن
  • ۽ منظور ٿيل اعتراض نه آهيnull
... پوء اسان لاڳاپيل خاصيتن جي مقابلي ۾ اڳتي وڌون ٿا. اسان لاء، هن جو مطلب آهي dnaCodeٻن شين جا شعبا. جڏهن equals()طريقي کي ختم ڪيو وڃي، انهن گهرجن کي ڏسڻ جي پڪ ڪريو:
  1. موٽڻ.

    جڏهن اهو equals()طريقو استعمال ڪيو ويندو آهي ڪنهن به شئي کي پاڻ سان ڀيٽڻ لاءِ، ان کي ضرور موٽڻو پوندو.
    اسان اڳ ۾ ئي هن گهرج جي تعميل ڪئي آهي. اسان جو طريقو شامل آهي:

    if (this == o) return true;

  2. سميٽري.

    جيڪڏهن a.equals(b) == true، پوء b.equals(a)واپس وڃڻ گهرجي true.
    اسان جو طريقو هن گهرج کي پڻ پورو ڪري ٿو.

  3. منتقلي.

    جيڪڏهن ٻه شيون ڪنهن ٽئين شئي جي برابر آهن، ته اهي هڪ ٻئي جي برابر هجڻ گهرجن.
    جيڪڏهن a.equals(b) == true۽ a.equals(c) == true، پوءِ b.equals(c)به سچو موٽڻو پوندو.

  4. استقامت.

    جو نتيجو equals()تبديل ٿيڻ ضروري آهي صرف ان صورت ۾ جڏهن ملوث شعبن کي تبديل ڪيو وڃي. جيڪڏهن ٻن شين جي ڊيٽا تبديل نه ٿيندي، پوء نتيجو equals()هميشه ساڳيو هجڻ گهرجي.

  5. عدم مساوات سان null.

    ڪنهن به اعتراض لاءِ، a.equals(null)غلط موٽڻ لازمي آهي
    اهو صرف ڪجهه ”مفيد سفارشن“ جو هڪ مجموعو ناهي، بلڪه هڪ سخت معاهدو آهي ، جيڪو Oracle دستاويزن ۾ مقرر ڪيو ويو آهي.

حصو 2: HashCode طريقو - بهترين عمل
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION