जावा में वस्तुओं की तुलना करते समय, आप एक शब्दार्थ जाँच करते हैं , वस्तुओं के प्रकार और पहचान की स्थिति की तुलना :
- खुद (एक ही उदाहरण)
- स्वयं (क्लोन, या पुनर्निर्मित प्रतिलिपि)
- विभिन्न प्रकार की अन्य वस्तुएं
- उसी प्रकार की अन्य वस्तुएं
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);
}