ITEM 10: The gerneral contract when overriding equlas
equals
λ©μλμ μ¬μ μμλ μ¬λ¬κ°μ§ ν¨μ μ΄ μλ€. κ·Έλ¬λ―λ‘ λ€μκ³Ό κ°μ μν©μμλ μ¬μ μ νμ§ μλ κ²μ΄ μ’λ€.
κ° μΈμ€ν΄μ€κ° λ³Έμ§μ μΌλ‘ κ³ μ ν κ²½μ°( λμνλ κ°μ²΄λ₯Ό νννλ ν΄λμ€ ex-
Thread
)μΈμ€ν΄μ€μ λ Όλ¦¬μ λμΉμ±(logical equality)μ κ²μ¬ν μΌμ΄ μλ κ²½μ°
μμ ν΄λμ€μμ μ¬μ μν
equals
κ° νμ ν΄λμ€μλ μ ν©ν κ²½μ°(AbstractSet
,AbstractList
)ν΄λμ€κ° private or package-privateμ΄κ³
equals
λ©μλλ₯Ό νΈμΆν μΌμ΄ μλ κ²½μ°
κ·Έλ λ€λ©΄ equals
λ₯Ό μ¬μ μν΄μΌν λλ μΈμ μΌκΉ?
κ°μ²΄ μλ³μ±(λ κ°μ²΄κ° 물리μ μΌλ‘ κ°μμ§)μ΄ μλλΌ λ
Όλ¦¬μ λμΉμ±(logical equality)μ νμΈν΄μΌνμ§λ§, μμ ν΄λμ€μ equals
κ° μ¬μ μλμ§ μμ κ²½μ°μ΄λ€. μ£Όλ‘, κ° ν΄λμ€(Integer
, String
)κ° ν΄λΉλλ€.
κ° ν΄λμ€μ΄λλΌλ μ μ ν©ν°λ¦¬ λ©μλ - item1λΌλ©΄ equals
λ₯Ό μ¬μ μνμ§ μμλ λλ€. (Enum
ν¬ν¨)
equals λ©μλ κ·μ½
equals
λ©μλλ λμΉκ΄κ³(equivalence relation)λ₯Ό ꡬννλ©°, λ€μμ λ§μ‘±νλ€.
κ·μ½
μ€λͺ
λ°μ¬μ±(reflexivity)
nullμ΄ μλ λͺ¨λ μ°Έμ‘° κ° xμ λν΄, x.equals(x)
λ trueμ΄λ€.
λμΉμ±(symmetry)
nullμ΄ μλ λͺ¨λ μ°Έμ‘° κ° x,yμ λν΄, x.equals(y)
κ° trueμ΄λ©΄, y.equals(x)
λ trueμ΄λ€.
μΆμ΄μ±(transitivity)
nullμ΄ μλ λͺ¨λ μ°Έμ‘° κ° x, y, zμ λν΄ x.equals(y)
κ° trueμ΄κ³ y.equals(z)
κ° trueμ΄λ©΄, x.eqauls(z)
λ trueμ΄λ€.
μΌκ΄μ±(consistency)
nullμ΄ μλ λͺ¨λ μ°Έμ‘° κ° x,yμ λν΄ x.equals(y)
λ₯Ό λ°λ³΅ν΄μ νΈμΆνλ©΄ νμ true or flaseλ₯Ό λ°ννλ€.
null μλ
nullμ΄ μλ λͺ¨λ μ°Έμ‘° κ° xμ λν΄, x.equals
λ flaseμ΄λ€.
equals
κ·μ½μ μ΄κΈ°λ©΄ κ·Έ κ°μ²΄λ₯Ό μ¬μ©νλ λ€λ₯Έ κ°μ²΄λ€μ΄ μ΄λ»κ² λ°μν μ§ μ μ μλ€.
λ°μ¬μ±
λ¨μν λ§νλ©΄ κ°μ²΄λ μκΈ° μμ κ³Ό κ°μμΌ νλ€λ λ»μ΄λ€.
λμΉμ±
λ κ°μ²΄λ μλ‘μ λν λμΉμ¬λΆμ λν΄ λκ°μ κ²°κ³Όκ° λμμΌνλ€.
μ¬κΈ°μ λ¬Έμ λ Stringμ equalsλ CaseInsensitiveString
μ μ‘΄μ¬λ₯Ό λͺ¨λ₯΄κΈ°λλ¬Έμ falseλ₯Ό λ°ννλ©°, μ΄λ λμΉμ±μ μλ°νλ€.
equals κ·μ½μ μ΄κΈ°λ©΄, κ·Έ κ°μ²΄λ₯Ό μ¬μ©νλ λ€λ₯Έ κ°μ²΄λ€μ΄ μ΄λ»κ² λ°μν μ§ μ μ μλ€. μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ μλμ κ°μ΄ Stringκ³Όμ μ°λμ νκ² λ€λ λͺ©νλ₯Ό λ²λ €μΌνλ€.
μΆμ΄μ±
첫 λ²μ§Έ κ°μ²΄μ λ λ²μ§Έ κ°μ²΄κ° κ°κ³ , λ λ²μ§Έ κ°μ²΄μ μΈ λ²μ§Έ κ°μ²΄κ° κ°λ€λ©΄, 첫λ²μ§Έ κ°μ²΄μ μΈλ²μ§Έ κ°μ²΄λ κ°μμΌνλ€λ μλ―Έμ΄λ€.
ColorPoint
ν΄λμ€μμ equals λ©μλλ₯Ό ꡬννμ§ μλλ€λ©΄, Point
equalsκ° μμλμ΄ μμ μ 보λ 무μλ μ± λΉκ΅λ₯Ό μννκ²λλ€. μ΄λ, κ·μ½μ μ΄κΈ΄ κ²μ μλμ§λ§, μ€μν μ 보λ₯Ό λμΉκ² λλ―λ‘ λ°μλ€μΌ μ μλ€.
λ€μκ³Ό κ°μ΄ equalsλ₯Ό ꡬννλ©΄ Pointμ ColorPointλ₯Ό λΉκ΅ν κ²°κ³Όμ κ·Έ λμ λ°κΏμ λΉκ΅ν κ²°κ³Όκ° λ€λ₯Ό μ μλ€. ( λμΉμ± μλ°° )
μ°μ p.equals(cp)
λ μμ μ 보μ λν λΉκ΅λ 무μνκ³ , cp.equals(p)
λ 맀κ°λ³μμ ν΄λμ€ μ’
λ₯κ° λ€λ₯΄λ€λ©° λ§€λ² falseλ§ λ°νν κ²μ΄λ€.
λ€μκ³Ό κ°μ΄ λ³κ²½νλ©΄, λμΉμ±μ λ§μ§λ§ μΆμ΄μ±μ μ¬μ ν μλ°°λλ©°, μ΄ λ°©μμ 무ν μ¬κ·μ λΉ μ§ μνλ μλ€. ꡬ체 ν΄λμ€λ₯Ό νμ₯ν΄ μλ‘μ΄ κ°μ μΆκ°νλ©΄μ equals κ·μ½μ λ§μ‘±μν¬ λ°©λ²μ μ‘΄μ¬νμ§ μλλ€.
equals
μμ instance κ²μ¬λ₯Ό getClass
κ²μ¬λ‘ λ°κΎΈλ©΄ κ·μ½λ μ§ν€λ©΄μ μμμ΄ κ°λ₯νλ€κ³ μκ°ν μ μμ§λ§, μ΄λ 리μ€μ½ν μΉν μμΉμ μλ°λλ€. 리μ€μ½ν μΉν μμΉμ λ°λ₯΄λ©΄, μ΄λ€ νμ
μ μμ΄ μ€μν μμ±μ΄λΌλ©΄, κ·Έ νμ νμ
μμλ λ§μ°¬κ°μ§λ‘ μ€μνλ€. λ°λΌμ κ·Έ νμ
μ λͺ¨λ λ©μλκ° νμ νμ
μμλ λκ°μ΄ μ λμν΄μΌνλ€.
ꡬ체 ν΄λμ€μ νμ ν΄λμ€μμ κ°μ μΆκ°ν λ°©λ²μ μμ§λ§ μ°νν μ μλ λ°©λ²μ΄ νλμλ€. [μμλμ μ»΄ν¬μ§μ μ μ¬μ©ν΄λΌ - Item18]
Point
λ₯Ό μμνλ λμ Point
λ₯Ό ColorPoint
μ private νλλ‘ λκ³ , ColorPoint
μ κ°μ μμΉμ μΌλ° Point
λ₯Ό λ°ννλ λ·°λ₯Ό publicμΌλ‘ μΆκ°νλ λ°©μμ΄λ€. μλ° λΌμ΄λΈλ¬λ¦¬μμλ ꡬ체 ν΄λμ€λ₯Ό νμ₯ν΄ κ°μ μΆκ°ν ν΄λμ€κ° μλ€.
Timestamp
λ Date
λ₯Ό μμλ°μ ν nanos νλλ₯Ό μΆκ°νλ€. κ·Έ κ²°κ³Ό Timestamp
μ equalsλ λμΉμ±μ μλ°°ν΄, Date κ°μ²΄μ ν 컬λ μ
μ λ£κ±°λ μλ‘ μμ΄ μ¬μ©νλ©΄, μλ±νκ² λμν μ μλ€. Timestamp
μ API μ€λͺ
μ μ£Όμμ¬νμ μΈκΈνκ³ μλ€.
μΌκ΄μ±
λ κ°μ²΄κ° κ°λ€λ©΄ μ΄λ νλ νΉμ λ κ°μ²΄κ° μμ λμ§ μλ ν μμΌλ‘λ μμν κ°μμΌ νλ€λ μλ―Έμ΄λ€. κ°λ³ κ°μ²΄λ λΉκ΅ μμ μ λ°λΌ μλ‘ λ€λ₯Ό μλ κ°μ μλ μλ λ°λ©΄, λΆλ³ κ°μ²΄λ νλ² λ€λ₯΄λ©΄ λκΉμ§ λ¬λΌμΌνλ€. μ¦, λΆλ³ ν΄λμ€λ₯Ό λ§λ€κΈ°λ‘ νλ€λ©΄ eqaulsλ νλ² κ°λ€κ³ ν κ°μ²΄μ μμν κ°κ³ , νλ² λ€λ₯Έ κ°μ²΄μλ μμν λ€λ₯΄λλ‘ λ§λ€μ΄μΌνλ€.
ν΄λμ€κ° λΆλ³μ΄λ κ°λ³μ΄λ equalsμ νλ¨μ μ λ’°ν μ μλ μμμ΄ λΌμ΄λ€κ² ν΄μλ μλλ€. (
java.net.URL
μ equlasλ μΌκ΄μ±μ μ΄κΉ)
NULL-μλ
λͺ¨λ κ°μ²΄κ° null
κ³Ό κ°μ§ μμμΌνλ€. μ€μλ‘ NullPointException
μ λμ§λ μ½λλ νν κ²μ΄μ§λ§, μ΄ κ·μ½μ μ΄λ¬ν κ²½μ°λ νμ©νμ§ μλλ€. λμΉμ± κ²μ¬λ₯Ό νλ €λ©΄ equalsλ κ°μ²΄λ₯Ό μ μ ν νλ³νν ν νμ νλλ€μ κ°μ μμμΌνλλ°, μ΄λ νλ³νμ μμ instanceof
μ°μ°μλ‘ μ
λ ₯ 맀κ°λ³μκ° μ¬λ°λ₯Έ νμ
μΈμ§ κ²μ¬ν΄μΌνλ€. instanceof
μ 첫λ²μ§Έ νΌμ°μ°μκ° nullμ΄λ©΄ falseλ₯Ό λ°ννλ―λ‘ λ¬΅μμ μΈ nullκ²μ¬λ₯Ό ν μ μλ€.
equals ꡬν μ£Όμ μ¬ν
==
μ°μ°μλ₯Ό μ¬μ©ν΄ μ λ ₯μ΄ μκΈ° μμ μ μ°Έμ‘°μΈμ§ νμΈinstanceof
μ°μ°μλ‘ μ λ ₯μ΄ μ¬λ°λ₯Έ νμ μΈμ§ νμΈμ λ ₯μ μ¬λ°λ₯Έ νμ μΌλ‘ νλ³ν νλ€.
μ λ ₯ κ°μ²΄μ μκΈ° μμ μ λμλλ 'ν΅μ¬' νλλ€μ΄ λͺ¨λ μΌμΉνλμ§ νλμ© κ²μ¬νλ€.
μ΄λ, float
, double
μ μ μΈν κΈ°λ³Έ νμ
νλλ ==
λ‘ λΉκ΅νκ³ , μ°Έμ‘° νμ
νλλ κ°κ°μ equals
λ©μλλ‘, float
, double
μ Float.compare(float, float)
μ Double.compare(double,double)
λ‘ λΉκ΅νλ€. Float.equals
μ Double.equals
λ μ€ν λ°μ±μ μλ°ν μ μμ΄ μ±λ₯μ μ’μ§ μλ€.
λλ‘λ nullκ°λ μ μ κ°μΌλ‘ μ·¨κΈνλ μ°Έμ‘° νμ
νλλ μλλ°, μ΄λλ Objects.equals(Object, Object)
λ‘ λΉκ΅ν΄ NullPointerException
μ μλ°©ν΄μΌνλ€.
λν, μ΄λ€ νλλ₯Ό λ¨Όμ λΉκ΅νλλκ° equalsμ μ±λ₯μ μ’μ°νκΈ°λ νλλ°, μ΅μμ μ±λ₯μ μν΄μλ λ€λ₯Ό κ°λ₯μ±μ΄ ν¬κ±°λ λΉκ΅νλ λΉμ©μ΄ μΌ νλλ₯Ό λ¨Όμ λΉκ΅νλ κ²μ΄ μ’λ€. λ Όλ¦¬μ μνμ κ΄λ ¨ μλ νλλ λΉκ΅ν΄μλ μλλ©°, ν΅μ¬ νλλ‘ κ³μ°ν μ μλ νμ νλλ κ΅³μ΄ λΉκ΅ν νμλ μλ€. νμ§λ§, νμ νλκ° κ°μ²΄ μ 체μ μνλ₯Ό λννλκ²½μ° νμνλλ₯Ό λΉκ΅νλ κ²μ΄ λ λΉ λ₯Ό μ μλ€.
equalsλ₯Ό μ¬μ μν λλ hashCodeλ λ°λμ μ¬μ μ ν΄μΌνλ€.(item 11)
Object
μΈμ νμ μ 맀겨λ³μλ‘ λ°λ equalsλ μ μΈνμ§ λ§μ.
AutoValue νλ μμν¬λ₯Ό μ¬μ©νλ©΄ equals
μ hashCode
λ₯Ό μμ±ν΄μ€λ€. (AutoValue μμ 보기)
@AutoValue
Last updated
Was this helpful?