JavaRush /جاوا بلاگ /Random-UR /جاوا میں hashCode() اور equals() طریقوں کے ساتھ کام کرنا
Lenchik854
سطح
Chernihiv

جاوا میں hashCode() اور equals() طریقوں کے ساتھ کام کرنا

گروپ میں شائع ہوا۔
اس پوسٹ میں میں طریقوں کے بارے میں اپنی سمجھ کا خاکہ پیش کروں گا hashCode()اور equals(). میں ان کے پہلے سے طے شدہ نفاذ کے ساتھ ساتھ ان کو صحیح طریقے سے اوور رائڈ کرنے کے بارے میں بات کرنا چاہتا ہوں۔ میں اپاچی کامن پیکیج کی مددگار کلاسوں کا استعمال کرتے ہوئے ان طریقوں کو نافذ کرنے کے بارے میں بھی لکھوں گا۔ جاوا میں hashCode() اور equals() طریقوں کے ساتھ کام کرنا - 1اس پوسٹ کے مشمولات:
  1. استعمال کرتے ہوئے hashCode()اور equals().
  2. پہلے سے طے شدہ رویے کو اوور رائیڈ کریں۔
  3. اپاچی کامنز لینگ کو اوور رائیڈ کرنا hashCode()اور استعمال کرنا۔equals()
  4. کچھ جو یاد رکھنا ضروری ہے۔
  5. ORM استعمال کرتے وقت خصوصی توجہ۔
hashCode()اور طریقوں کی equals()تعریف کلاس میں کی گئی تھی Object، جو جاوا آبجیکٹ کے لیے پیرنٹ کلاس ہے۔ لہذا، تمام جاوا آبجیکٹ ان طریقوں سے پہلے سے طے شدہ نفاذ کے وارث ہیں۔

ہیش کوڈ () اور برابر () کا استعمال

یہ طریقہ hashCode()کسی دیے گئے شے کے لیے ایک منفرد عدد عدد حاصل کرنے کے لیے استعمال کیا جاتا ہے۔ جب کسی چیز کو ہیش ٹیبل میں ڈیٹا سٹرکچر کے طور پر ذخیرہ کرنے کی ضرورت ہوتی ہے (جسے بالٹی بھی کہا جاتا ہے)، اس نمبر کو اس ٹیبل میں اس کے مقام کا تعین کرنے کے لیے استعمال کیا جاتا ہے۔ پہلے سے طے شدہ طور پر، کسی شے کا طریقہ hashCode()میموری کے مقام کا نمبر لوٹاتا ہے جہاں آبجیکٹ کو محفوظ کیا جاتا ہے۔ طریقہ equals()، جیسا کہ اس کے نام سے پتہ چلتا ہے، صرف دو اشیاء کی مساوات کو جانچنے کے لیے استعمال کیا جاتا ہے۔ اس طریقہ کار کا پہلے سے طے شدہ نفاذ صرف دو اشیاء کے حوالہ جات کی جانچ پڑتال کرتا ہے کہ آیا وہ مساوی ہیں۔

پہلے سے طے شدہ رویے کو اوور رائیڈ کرنا

جب تک آپ اپنی کلاسوں میں ان طریقوں میں سے کسی کو اوور رائڈ نہیں کرتے تب تک سب کچھ ٹھیک کام کرتا ہے۔ لیکن بعض اوقات ایپلی کیشنز کو کچھ اشیاء کے ڈیفالٹ رویے کو تبدیل کرنے کی ضرورت ہوتی ہے۔ آئیے ایک مثال لیں جہاں آپ کے پاس ہے Employee۔ آئیے ایسی کلاس کی کم از کم ممکنہ ساخت لکھتے ہیں۔
public class Employee
{
    private Integer id;
    private String firstname;
    private String lastName;
    private String department;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
}
اوپر بیان کردہ کلاس Employeeمیں کچھ بنیادی صفات اور رسائی کے طریقے ہیں۔ اب ایک سادہ سی صورت حال کو دیکھتے ہیں جہاں ہمیں کلاس کی دو اشیاء کا موازنہ کرنے کی ضرورت ہے Employee۔
public class EqualsTest {
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();

        e1.setId(100);
        e2.setId(100);
        //Печатает false в консоли
        System.out.println(e1.equals(e2));
    }
}
یہ اندازہ لگانے کے لیے کسی دعویدار کی ضرورت نہیں ہے کہ مذکورہ طریقہ "جھوٹا" لوٹ آئے گا۔ لیکن کیا یہ حقیقت میں درست ہے، یہ دیکھتے ہوئے کہ یہ دونوں چیزیں ایک جیسی ہیں؟ ریئل ٹائم ایپلی کیشن میں، طریقہ درست ہونا چاہیے۔ درست رویہ حاصل کرنے کے لیے، ہمیں طریقہ کو اوور رائڈ کرنے کی ضرورت ہے equals()، جیسا کہ ذیل میں کیا گیا ہے:
public boolean equals(Object o) {
        if(o == null)
        {
            return false;
        }
        if (o == this)
        {
           return true;
        }
        if (getClass() != o.getClass())
        {
            return false;
        }
        Employee e = (Employee) o;
        return (this.getId() == e.getId());
}
اس طریقہ کو اپنی کلاس میں شامل کریں Employeeاور مساوی چیک "سچ" لوٹ آئے گا۔ تاہم، کیا ہم نے سب کچھ کیا ہے؟ ابھی تک نہیں. آئیے اپنی ترمیم شدہ کلاس کو ایک اور طریقے سے جانچتے ہیں۔
import java.util.HashSet;
import java.util.Set;

public class EqualsTest
{
    public static void main(String[] args)
    {
        Employee e1 = new Employee();
        Employee e2 = new Employee();

        e1.setId(100);
        e2.setId(100);

        //Печатает 'true'
        System.out.println(e1.equals(e2));

        Set employees = new HashSet();
        employees.add(e1);
        employees.add(e2);
        //Печатает два an object
        System.out.println(employees);
    }
}
کمانڈ System.out.println(employee)دو اشیاء کو پرنٹ کرتی ہے۔ اگر دونوں اشیاء مساوی تھیں، اور Setاس میں صرف منفرد اشیاء موجود تھیں، تو HashSetاندر صرف ایک مثال ہونی چاہیے، یعنی دونوں اشیاء کلاس کی ایک ہی مثالوں کا حوالہ دیتے ہیں Employee۔ ہم نے کیا کھویا ہے؟ ہم نے دوسرا اہم طریقہ کھو دیا hashCode()۔ جیسا کہ java دستاویزات میں کہا گیا ہے، اگر آپ طریقہ کو اوور رائڈ کرتے ہیں equals()، تو آپ کو طریقہ کو اوور رائڈ کرنا ہوگا hashCode()۔ تو آئیے اپنی کلاس میں ایک اور طریقہ شامل کریں Employee۔
@Override
 public int hashCode()
 {
    final int PRIME = 31;
    int result = 1;
    result = PRIME * result + getId();
    return result;
 }
ہم نے اس طریقہ کو اپنی کلاس میں ایک بار شامل کیا، اور صرف ایک آبجیکٹ پرنٹ کیا جائے گا، اور اس طرح، e1 اور e2 کے برابری کی جانچ کرنا درست ثابت ہوا۔

اپاچی کامنز لینگ کو اوور رائیڈ کرنا hashCode()اور استعمال کرناequals()

Apache Commons کال کرنے کے طریقوں hashCode()اور equals(). ذیل میں ہم استعمال دیکھتے ہیں:
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Employee
{
 private Integer id;
 private String firstname;
 private String lastName;
 private String department;
public Integer getId() {
    return id;
 }
 public void setId(Integer id) {
    this.id = id;
 }
 public String getFirstname() {
    return firstname;
 }
 public void setFirstname(String firstname) {
    this.firstname = firstname;
 }
 public String getLastName() {
    return lastName;
 }
 public void setLastName(String lastName) {
    this.lastName = lastName;
 }
 public String getDepartment() {
    return department;
 }
 public void setDepartment(String department) {
    this.department = department;
 }
@Override
 public int hashCode()
 {
    final int PRIME = 31;
    return new HashCodeBuilder(getId()%2==0?getId()+1:getId(), PRIME).
           toHashCode();
 }
@Override
 public boolean equals(Object o) {
    if (o == null)
       return false;
    if (o == this)
       return true;
    if (o.getClass() != getClass())
       return false;
    Employee e = (Employee) o;
       return new EqualsBuilder().
              append(getId(), e.getId()).
              isEquals();
    }
 }
دوسری طرف، اگر آپ کوڈ ایڈیٹرز میں سے ایک استعمال کرتے ہیں، تو وہ آپ کے لیے کچھ اچھے ڈھانچے کو کال کرنے کے قابل بھی ہوں گے۔ مثال کے طور پر، اگر Eclipse IDE میں آپ کلاس >> source> Generating hashCode() اور equals()... پر دائیں کلک کرتے ہیں تو یہ آپ کے لیے بہت اچھا عمل درآمد کرے گا۔ جاوا میں hashCode() اور equals() طریقوں کے ساتھ کام کرنا - 2کچھ جو یاد رکھنا ضروری ہے۔
  1. hashCode()اور اور دونوں کو کال کرنے کے لیے ہمیشہ ایک ہی آبجیکٹ کی خصوصیات کا استعمال کریں equals()۔ صرف ہمارے معاملے میں، ہم نے استعمال کیا employee id.
  2. طریقہ equals()مستقل ہونا چاہیے (اگر اعتراض تبدیل نہیں ہوا ہے، تو طریقہ کو وہی قدر واپس کرنی چاہیے)۔
  3. جب بھی a.equals(b)، پھر a.hashCode()جیسا ہی ہونا چاہیے b.hashCode()۔
  4. اگر آپ ایک طریقہ کو اوور رائیڈ کرتے ہیں، تو آپ کو دوسرے کو اوور رائڈ کرنا ہوگا۔

ORM استعمال کرتے وقت خصوصی توجہ

اگر آپ ORM (ru.wikipedia.org/wiki/ORM) کے ساتھ کام کر رہے ہیں، تو ہمیشہ getters کا استعمال کریں اور کبھی بھی فیلڈ حوالہ جات استعمال نہ کریں hashCode()۔ equals()اس کی وجہ یہ ہے کہ ایک ORM میں، وقتاً فوقتاً فیلڈز سست لوڈ کا استعمال کرتے ہوئے لوڈ کیے جاتے ہیں اور جب تک ان کے حاصل کرنے والوں کو بلایا نہیں جاتا، ان تک رسائی ممکن نہیں ہوتی۔ مثال کے طور پر، ہماری کلاس میں Employee، ہم استعمال کرتے ہیں e1.id == e2.id۔ یہ مکمل طور پر ممکن ہے کہ iڈی فیلڈز سست لوڈنگ کا استعمال کرتے ہوئے بھری ہوں۔ فیلڈز میں سے ایک 0 یا null ہو سکتا ہے اور ہمیں غلط رویہ ملے گا۔ لیکن، اگر استعمال کیا جاتا ہے تو e1.getId() == e2.getId()، ہم اس بات کا یقین کر سکتے ہیں کہ اگر فیلڈز سست لوڈنگ کا استعمال کرتے ہوئے لوڈ کیے گئے ہوں؛ گیٹر کو کال کرنے سے پہلے فیلڈ کو آباد کیا جائے گا۔ hashCode()میں اور طریقوں کے بارے میں اتنا ہی جانتا ہوں equals()۔ امید ہے کہ یہ کہیں سے کسی کی مدد کرتا ہے۔ آپ کی تعلیم کے ساتھ گڈ لک!! ps ترجمہ کی یہ میری پہلی کوشش ہے۔ میں نے ہر ممکن حد تک قریب سے پہنچانے کی کوشش کی جو مصنف کہنا چاہتا ہے۔ اگر آپ کے ذہن میں کوئی رائے ہے تو کمنٹس میں لکھیں۔ سختی سے فیصلہ نہ کریں :-))) اصل مضمون
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION