জাভাতে অবজেক্টগুলির সাথে তুলনা করার সময়, আপনি একটি শব্দার্থ চেক করেন , প্রকারের সাথে তুলনা করে এবং রাষ্ট্রের শনাক্তকরণ অবজেক্টের :
- নিজেই (একই উদাহরণ)
- নিজেই (ক্লোন বা পুনর্গঠিত অনুলিপি)
- বিভিন্ন ধরণের অন্যান্য বস্তু
- একই ধরণের অন্যান্য অবজেক্ট
null
নিয়মাবলী:
- প্রতিসম :
a.equals(b) == b.equals(a)
equals()
সবসময় উৎপাদ true
বা false
করি কিন্তু সেই NullpointerException
, ClassCastException
বা অন্য কোন নিক্ষেপযোগ্য
তুলনা:
- টাইপ চেক : উভয় দৃষ্টান্ত একই ধরণের হওয়া দরকার যার অর্থ আপনাকে সাম্যের জন্য প্রকৃত শ্রেণীর তুলনা করতে হবে। এটি প্রায়শই সঠিকভাবে প্রয়োগ করা হয় না, যখন বিকাশকারীরা
instanceof
প্রকার তুলনা করার জন্য ব্যবহার করে (যা কেবল তখন পর্যন্ত কাজ করে যখন কোনও সাবক্লাস নেই, এবং যখন প্রতিসম নিয়ম লঙ্ঘন করে A extends B -> a instanceof b != b instanceof a)
।
- শনাক্তকরণের স্থিতিক চেক : নিশ্চিত করুন যে কোন রাজ্যের দ্বারা দৃষ্টান্তগুলি সনাক্ত করা হয়েছে তা আপনি বুঝতে পেরেছেন। ব্যক্তিরা তাদের সামাজিক সুরক্ষা নম্বর দ্বারা চিহ্নিত হতে পারে তবে চুলের রঙ (রঙ করা যায় না), নাম (পরিবর্তন করা যেতে পারে) বা বয়স (সমস্ত সময় পরিবর্তন হয়) দ্বারা নয়। কেবলমাত্র মান অবজেক্টের সাথে আপনার সম্পূর্ণ রাষ্ট্রের (সমস্ত অস্থায়ী ক্ষেত্র) তুলনা করা উচিত, অন্যথায় উদাহরণটি কী তা চিহ্নিত করে কেবল তা পরীক্ষা করুন।
আপনার Person
শ্রেণীর জন্য:
public boolean equals(Object obj) {
// same instance
if (obj == this) {
return true;
}
// null
if (obj == null) {
return false;
}
// type
if (!getClass().equals(obj.getClass())) {
return false;
}
// cast and compare state
Person other = (Person) obj;
return Objects.equals(name, other.name) && Objects.equals(age, other.age);
}
পুনরায় ব্যবহারযোগ্য, জেনেরিক ইউটিলিটি শ্রেণি:
public final class Equals {
private Equals() {
// private constructor, no instances allowed
}
/**
* Convenience equals implementation, does the object equality, null and type checking, and comparison of the identifying state
*
* @param instance object instance (where the equals() is implemented)
* @param other other instance to compare to
* @param stateAccessors stateAccessors for state to compare, optional
* @param <T> instance type
* @return true when equals, false otherwise
*/
public static <T> boolean as(T instance, Object other, Function<? super T, Object>... stateAccessors) {
if (instance == null) {
return other == null;
}
if (instance == other) {
return true;
}
if (other == null) {
return false;
}
if (!instance.getClass().equals(other.getClass())) {
return false;
}
if (stateAccessors == null) {
return true;
}
return Stream.of(stateAccessors).allMatch(s -> Objects.equals(s.apply(instance), s.apply((T) other)));
}
}
আপনার Person
শ্রেণীর জন্য, এই ইউটিলিটি ক্লাসটি ব্যবহার করে:
public boolean equals(Object obj) {
return Equals.as(this, obj, t -> t.name, t -> t.age);
}