
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.
}
فرض ڪريو اسان هڪ پروگرام لکي رهيا آهيون جنهن کي اهو طئي ڪرڻ جي ضرورت آهي ته ٻه ماڻهو هڪجهڙا جاڙا آهن يا صرف هڪجهڙا آهن. اسان وٽ پنج خاصيتون آهن: نڪ جي ماپ، اکين جو رنگ، وارن جو انداز، داغ جي موجودگي، ۽ ڊي اين اي ٽيسٽ جا نتيجا (سادگي لاءِ، اسان ان کي انٽيجر ڪوڊ طور پيش ڪندا آهيون). انهن خاصيتن مان ڪهڙيون خاصيتون توهان جي خيال ۾ اسان جي پروگرام کي هڪجهڙائي واري ٽوئن جي سڃاڻپ ڪرڻ جي اجازت ڏين ٿيون؟ 
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()
طريقي کي ختم ڪيو وڃي، انهن گهرجن کي ڏسڻ جي پڪ ڪريو:
-
موٽڻ.
جڏهن اهو
equals()
طريقو استعمال ڪيو ويندو آهي ڪنهن به شئي کي پاڻ سان ڀيٽڻ لاءِ، ان کي ضرور موٽڻو پوندو.
اسان اڳ ۾ ئي هن گهرج جي تعميل ڪئي آهي. اسان جو طريقو شامل آهي:if (this == o) return true;
-
سميٽري.
جيڪڏهن
a.equals(b) == true
، پوءb.equals(a)
واپس وڃڻ گهرجيtrue
.
اسان جو طريقو هن گهرج کي پڻ پورو ڪري ٿو. -
منتقلي.
جيڪڏهن ٻه شيون ڪنهن ٽئين شئي جي برابر آهن، ته اهي هڪ ٻئي جي برابر هجڻ گهرجن.
جيڪڏهنa.equals(b) == true
۽a.equals(c) == true
، پوءِb.equals(c)
به سچو موٽڻو پوندو. -
استقامت.
جو نتيجو
equals()
تبديل ٿيڻ ضروري آهي صرف ان صورت ۾ جڏهن ملوث شعبن کي تبديل ڪيو وڃي. جيڪڏهن ٻن شين جي ڊيٽا تبديل نه ٿيندي، پوء نتيجوequals()
هميشه ساڳيو هجڻ گهرجي. -
عدم مساوات سان
null
.ڪنهن به اعتراض لاءِ،
a.equals(null)
غلط موٽڻ لازمي آهي
اهو صرف ڪجهه ”مفيد سفارشن“ جو هڪ مجموعو ناهي، بلڪه هڪ سخت معاهدو آهي ، جيڪو Oracle دستاويزن ۾ مقرر ڪيو ويو آهي.
GO TO FULL VERSION