item 19 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μμμ κ³ λ €ν΄ μ€κ³νκ³ λ¬ΈμννλΌ. κ·Έλ¬μ§ μμλ€λ©΄ μμμ κΈμ§νλΌ
μμμ© ν΄λμ€λ λ¬ΈμννλΌ
μμμ© ν΄λμ€λ μ¬μ μν μ μλ λ©μλλ€μ λ΄λΆμ μΌλ‘ μ΄λ»κ² μ΄μ©νλμ§(μκΈ°μ¬μ©) λ¬Έμλ‘ λ¨κ²¨μΌ νλ€. μ¬μ μ κ°λ₯μ΄λ publicκ³Ό protected λ©μλ μ€ finalμ΄ μλ λͺ¨λ λ©μλλ₯Ό μλ―Ένλ€.
λ¬Έμλ‘ λ¨κΈ°λ λ°©λ²μΌλ‘ @implSpec
μ μ¬μ©νλ κ²μ΄ μλ€. μλμ κ°μ΄ Tagλ₯Ό μ¬μ©νλ©΄ μλ°λ
λκ΅¬κ° "Implementation Requirements"λ‘ μμνλ μ μ API λ¬Έμμ λ©μλμ μΆκ°ν΄μ€λ€.
/**
* @implSpec
* μ΄κ³³μ λ΄μ©μ λ£μΌλ©΄ "Implementation Requirements"λ‘ μμνλ μ μ΄ μμ±λλ€
*/
public class Test {
...
}
μλ₯Ό λ€μ΄, java.util.AbstractionCollectionμ μλ°λ λ΄μ©μ λ²μμ΄λ€.
μ£Όμ΄μ§ μμκ° μ΄ μ»¬λ μ μμ μλ€λ©΄ κ·Έ μΈμ€ν΄μ€λ₯Ό νλ μ κ±°νλ€.(μ νμ λμ) λ μ ννκ² λ§νλ©΄, μ΄ μ»¬λ μ μμ 'Object.equals(o, e)κ° μ°ΈμΈ μμ' eκ° νλ μ΄μ μλ€λ©΄ κ·Έ μ€ νλλ₯Ό μ κ±°νλ€. μ£Όμ΄μ§ μμκ° μ»¬λ μ μμ μμλ€λ©΄, (μ¦, νΈμΆ κ²°κ³Ό μ΄ μ»¬λ μ μ΄ λ³κ²½λλ€λ©΄) trueλ₯Ό λ°ννλ€.
Implemented RequirementsΒ : μ΄ λ©μλλ 컬λ μ μ μννλ©° μ£Όμ΄μ§ μμλ₯Ό μ°Ύλλ‘ κ΅¬νλμλ€. μ£Όμ΄μ§ μμλ₯Ό μ°ΎμΌλ©΄ λ°λ³΅μμ remove λ©μλλ₯Ό μ¬μ©ν΄ 컬λ μ μμ μ κ±°νλ€. μ΄ μ»¬λ μ μ΄ μ£Όμ΄μ§ κ°μ²΄λ₯Ό κ°κ³ μμΌλ, μ΄ μ»¬λ μ μ iterator λ©μλκ° λ°νν λ°λ³΅μκ° remove λ©μλλ₯Ό ꡬννμ§ μμλ€λ©΄ UnsupportedOperationExceptionμ λμ§λ μ£Όμνμ.
μ€λͺ μ λ°λ₯΄λ©΄ iterator λ©μλλ₯Ό μ¬μ μνλ©΄ remove λ©μλμ λμμ μν₯μ μ€μ νμ€ν μ μ μλ€.
ν΄λμ€μ λ΄λΆ λμ κ³Όμ μ€κ°μ λΌμ΄λ€ μ μλ ν (hook)μ μ μ λ³νμ¬ protected λ©μλ ννλ‘ κ³΅κ°ν΄μΌ ν μλ μλ€
protected void removeRange(int fromIndex, int toIndex)
fromIndex(ν¬ν¨)λΆν° toIndex(λ―Έν¬ν¨)κΉμ§μ λͺ¨λ μμλ₯Ό μ΄ λ¦¬μ€νΈμμ μ κ±°νλ€. toIndex μ΄νμ μμλ€μ μμΌλ‘ λΉκ²¨μ§λ€. μ΄ νΈμΆλ‘ 리μ€νΈλ 'toIndex - fromIndex'λ§νΌ μ§§μμ§λ€.
μ΄ λ¦¬μ€νΈ νΉμ μ΄ λ¦¬μ€νΈμ λΆλΆλ¦¬μ€νΈμ μ μλ clear μ°μ°μ΄ μ΄ λ©μλλ₯Ό νΈμΆνλ€. 리μ€νΈ ꡬνμ λ΄λΆ ꡬ쑰λ₯Ό νμ©νλλ‘ μ΄ λ©μλλ₯Ό μ¬μ μνλ©΄ μ΄ λ¦¬μ€νΈμ λΆλΆλ¦¬μ€νΈμ clear μ°μ° μ±λ₯μ ν¬κ² κ°μ ν μ μλ€.
Implemented RequirementsΒ : μ΄ λ©μλλ fromIndexμμ μμνλ 리μ€νΈ λ°λ³΅μλ₯Ό μ»μ΄ λͺ¨λ μμλ₯Ό μ κ±°ν λκΉμ§ ListIterator.nextμ ListIterator.removeλ₯Ό λ°λ³΅ νΈμΆνλ€.
μ£Όμ: ListIterator.removeκ° μ ν μκ°μ΄ 걸리면 μ΄ κ΅¬νμ μ±λ₯μ μ κ³±μ λΉλ‘νλ€.
List ꡬν체μ μ΅μ’ μ¬μ©μλ removeRange λ©μλμ κ΄μ¬μ΄ μλ€. κ·ΈλΌμλ μ΄ λ©μλλ₯Ό μ 곡ν μ΄μ λ λ¨μ§ νμ ν΄λμ€μμ λΆλΆλ¦¬μ€νΈμ clear λ©μλλ₯Ό κ³ μ±λ₯μΌλ‘ λ§λ€κΈ° μ½κ² νκΈ° μν΄μλ€.
μμμ© ν΄λμ€μ μμ±μλ μ¬μ μ κ°λ₯ λ©μλλ₯Ό νΈμΆν΄μλ μλλ€
μμ ν΄λμ€μ μμ±μκ° νμ ν΄λμ€μ μμ±μλ³΄λ€ λ¨Όμ μ€νλλ―λ‘ νμ ν΄λμ€μμ μ¬μ μν λ©μλκ° νμ ν΄λμ€μ μμ±μλ³΄λ€ λ¨Όμ νΈμΆλλ€. μ΄λ κ·Έ μ¬μ μν λ©μλκ° νμ ν΄λμ€μ μμ±μμμ μ΄κΈ°ννλ κ°μ μμ‘΄νλ€λ©΄ μλλλ‘ λμνμ§ μλλ€.
public class Super {
// μλͺ»λ μ - μμ±μκ° μ¬μ μ κ°λ₯ λ©μλλ₯Ό νΈμΆνλ€.
public Super(){
overrideMe();
}
public void overrideMe() {
}
}
public final class Sub extends Super {
// μ΄κΈ°νλμ§ μμ final νλ, μμ±μμμ μ΄κΈ°ννλ€.
private final Instant instant;
Sub() {
instant = Instant.now();
}
// μ¬μ μ κ°λ₯ λ©μλ. μμ ν΄λμ€μ μμ±μκ° νΈμΆνλ€.
@Override public void overrideMe() {
System.out.println(instant);
}
public static void main(String[] args) {
Sub sub = new Sub();
sub.overrideMe();
}
}
μ΄ νλ‘κ·Έλ¨μ΄ instantλ₯Ό λ λ² μΆλ ₯νλ¦¬λΌ κΈ°λνκ² μ§λ§, 첫 λ²μ§Έλ nullμ μΆλ ₯νλ€. μμ ν΄λμ€μ μμ±μλ νμ ν΄λμ€μ μμ±μκ° μΈμ€ν΄μ€ νλλ₯Ό μ΄κΈ°ννκΈ°λ μ μ overrideMeλ₯Ό νΈμΆνκΈ° λλ¬Έμ΄λ€.
clone
κ³Ό readObject
λ©μλλ μμ±μμ λΉμ·ν ν¨κ³Όλ₯Ό λΈλ€. λ°λΌμ μμμ© ν΄λμ€μμ Cloneableμ΄λ Serializableμ ꡬνν μ§ μ ν΄μΌ νλ€λ©΄, μ΄λ€μ ꡬνν λ λ°λ₯΄λ μ μ½λ μμ±μμ λΉμ·νλ€λ μ μ μ£Όμνμ. μ¦, cloneκ³Ό readObject λͺ¨λ μ§μ μ μΌλ‘λ κ°μ μ μΌλ‘λ μ¬μ μ κ°λ₯ λ©μλλ₯Ό νΈμΆν΄μλ μ λλ€.
λ§μ§λ§μΌλ‘, Serializable
μ ꡬνν μμμ© ν΄λμ€κ° readResolve
λ writeReplace
λ©μλλ₯Ό κ°λλ€λ©΄ μ΄ λ©μλλ€μ privateμ΄ μλ protected
λ‘ μ μΈν΄μΌ νλ€. privateμΌλ‘ μ μΈνλ€λ©΄ νμ ν΄λμ€μμ 무μλκΈ° λλ¬Έμ΄λ€. μ΄ μμ μμμ νμ©νκΈ° μν΄ λ΄λΆ ꡬνμ ν΄λμ€ APIλ‘ κ³΅κ°νλ μ μ€ νλλ€.
μμμ©μΌλ‘ μ€κ³νμ§ μμ ν΄λμ€λ μμμ κΈμ§νλΌ
λ°©λ²μ 2κ°μ§ μ΄λ€.
- ν΄λμ€λ₯Ό finalλ‘ μ μΈνλ λ°©λ²
- λͺ¨λ μμ±μλ₯Ό privateμ΄λ package-privateμΌλ‘ γ λλνκ³ public μ μ ν©ν°λ¦¬λ₯Ό λ§λ€μ΄ μ£Όλ λ°©λ²
ν΅μ¬ μ 리
μμμ© ν΄λμ€λ₯Ό μ€κ³ νκΈ°λ κ²°μ½ λ§λ§μΉ μλ€. ν΄λμ€ λ΄λΆμμ μ€μ€λ‘λ₯Ό μ΄λ»κ² μ¬μ©νλμ§(μκΈ°μ¬μ© ν¨ν΄) λͺ¨λ λ¬Έμλ‘ λ¨κ²¨μΌ νλ©°, μΌλ¨ λ¬Έμνν κ²μ κ·Έ ν΄λμ€κ° μ°μ΄λ ν λ°λμ μ§μΌμΌ νλ€. κ·Έλ¬μ§ μμΌλ©΄ κ·Έ λ΄λΆ ꡬν λ°©μμ λ―Ώκ³ νμ©νλ νμ ν΄λμ€λ₯Ό μ€λμνκ² λ§λ€ μ μλ€. λ€λ₯Έ μ΄κ° ν¨μ¨ μ’μ νμ ν΄λμ€λ₯Ό λ§λ€ μ μλλ‘ μΌλΆ λ©μλλ₯Ό protectedλ‘ μ 곡ν΄μΌ ν μλ μλ€. κ·Έλ¬λ ν΄λμ€λ₯Ό νμ₯ν΄μΌ ν λͺ νν μ΄μ κ° λ μ€λ₯΄μ§ μμΌλ©΄ μμμ κΈμ§νλ νΈμ΄ λμ κ²μ΄λ€. μμμ κΈμ§νλ €λ©΄ ν΄λμ€λ₯Ό finalλ‘ μ μΈνκ±°λ μμ±μ λͺ¨λλ₯Ό μΈλΆμμ μ κ·Όν μ μλλ‘ λ§λ€λ©΄ λλ€.