item 18 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- μμμ μ½λλ₯Ό μ¬μ¬μ©νλ κ°λ ₯ν μλ¨μ΄μ§λ§, νμ μ΅μ μ μλλ€.
- μμ ν΄λμ€μ νμ ν΄λμ€λ₯Ό λͺ¨λ κ°μ νλ‘κ·Έλλ¨Έκ° ν΅μ νλ ν¨ν€μ§ μμμλΌλ©΄ μμλ μμ ν λ°©λ²μ΄λ€.
νμ₯ν λͺ©μ μΌλ‘ μ€κ³λμκ³ λ¬Έμνλ μ λ ν΄λμ€(μμ΄ν
19)λ λ§μ°¬κ°μ§λ‘ μμ νλ€.
νμ§λ§ μΌλ°μ μΈ κ΅¬μ²΄ ν΄λμ€λ₯Ό ν¨ν€μ§ κ²½κ³λ₯Ό λμ΄, μ¦ λ€λ₯Έ ν¨ν€μ§μ ꡬ체 ν΄λμ€λ₯Ό μμνλ μΌμ μννλ€. - λ©μλ νΈμΆκ³Ό λ¬λ¦¬ μμμ μΊ‘μνλ₯Ό κΉ¨λ¨λ¦°λ€. μμ ν΄λμ€λ 릴리μ€λ§λ€ λ΄λΆ ꡬνμ΄ λ¬λΌμ§ μ μμΌλ©°, κ·Έ μ¬νλ‘ μ½λ ν μ€ κ±΄λλ¦¬μ§ μμ νμ ν΄λμ€κ° μ€λμν μ μλ€λ λ§μ΄λ€
public class InstrumentedHashSet<E> extends HashSet<E> {
// μΆκ°λ μμμ μ
private int addCount = 0;
public InstrumentedHashSet() {
}
public InstrumentedHashSet(int initCap, float loadFactor) {
super(initCap, loadFactor);
}
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}μ μ½λ λ² μ΄μ€μμ μλ μ½λλ₯Ό μ€ννλ κ²½μ° μλͺ»λ κ²°κ³Όκ° μΆλ ₯λλ€.
InstrumentedHashSet<String> s = new InstrumentedHashSet<>();
s.addAll(List.of("ν±", "νν", "ν"));- s.μ sizeλ 3μ μμνμ§λ§ μ€νμμΌλ³΄λ©΄ 6μ΄ λμ¨λ€.
- InstrumentedHashSet addAll()μ λ΄λΆμμ addCountλ₯Ό λνκ³ super.addAll(c) λ‘ HashSetμ λ©μλλ₯Ό νΈμΆνλ€. HashSetμ addAll()μ add()λ₯Ό λ§€λ² νΈμΆνλ λ°©μμΌλ‘ ꡬνλμ΄ μλλ°, InstrumentedHashSetμ add()μ addCount++ μ°μ°μ΄ μκΈ° λλ¬Έμ ν¬κΈ°κ° 2λ°°λ‘ λμ¨ κ²μ΄λ€.
- μ΄ μ²λΌ μμ μ λ€λ₯Έ λΆλΆμ μ¬μ©νλ λΆλΆμ ν΄λΉ ν΄λμ€μ λ΄λΆ ꡬν λ°©μμ μμ‘΄ν μ λ°μ μλ€. InstrumentedHashSetλ κΉ¨μ§μ μ¬μ΄ ν΄λμ€μΈ κ²μ΄λ€.
- λν HashSetμ μλ‘μ΄ λ©μλκ° μΆκ°λμ λ, InstrumentedHashSetκ° μ΄λ₯Ό μ μ ν override νμ§ λͺ»νλ€λ©΄ 보μ μ·¨μ½μ μ΄ λ μλ μλ€.
- κΈ°μ‘΄ ν΄λμ€λ₯Ό νμ₯νλ λμ , μλ‘μ΄ ν΄λμ€λ₯Ό λ§λ€κ³ private νλλ‘ κΈ°μ‘΄ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νκ² νμ.
public class InstrumentedSet<E> extends ForwardingSet<E> {
private int addCount = 0;
public InstrumentedSet(Set<E> s) {
super(s);
}
@Override public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
}
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) { this.s = s; }
public void clear() { s.clear(); }
public boolean contains(Object o) { return s.contains(o); }
public boolean isEmpty() { return s.isEmpty(); }
public int size() { return s.size(); }
public Iterator<E> iterator() { return s.iterator(); }
public boolean add(E e) { return s.add(e); }
public boolean remove(Object o) { return s.remove(o); }
public boolean containsAll(Collection<?> c)
{ return s.containsAll(c); }
public boolean addAll(Collection<? extends E> c)
{ return s.addAll(c); }
public boolean removeAll(Collection<?> c)
{ return s.removeAll(c); }
public boolean retainAll(Collection<?> c)
{ return s.retainAll(c); }
public Object[] toArray() { return s.toArray(); }
public <T> T[] toArray(T[] a) { return s.toArray(a); }
@Override public boolean equals(Object o)
{ return s.equals(o); }
@Override public int hashCode() { return s.hashCode(); }
@Override public String toString() { return s.toString(); }
}- ꡬ체μ μΌλ‘ Set μΈν°νμ΄μ€λ₯Ό ꡬννκ³ Set μΈμ€ν΄μ€λ₯Ό μΈμλ‘ λ°λ μμ±μλ₯Ό νλ μ 곡νλ€. μμμ Setμ κ³μΈ‘ κΈ°λ₯μ λ§μμ μλ‘μ΄ SetμΌλ‘ λ§λλ κ²μ΄ μ΄ ν΄λμ€μ ν΅μ¬μ΄λ€.
- ν λ²λ§ ꡬνν΄λλ©΄ μ΄λ ν Set ꡬν체λΌλ ν¨κ» μ¬μ©ν μ μλ€.
-
λ€λ₯Έ Set μΈμ€ν΄μ€λ₯Ό κ°μΈκ³ (wrap) μλ€λ λ»μμ InstrumentedSet κ°μ ν΄λμ€λ₯Ό λνΌ ν΄λμ€λΌ νλ©°, λ€λ₯Έ Setμ κ³μΈ‘ κΈ°λ₯μ λ§μμ΄λ€λ λ»μμ λ°μ½λ μ΄ν° ν¨ν΄(Decorator pattern)μ΄λΌκ³ νλ€. μ»΄ν¬μ§μ κ³Ό μ λ¬μ μ‘°ν©μ λμ μλ―Έλ‘ μμ(delegation)μ΄λΌκ³ λΆλ₯Έλ€. λ¨, μλ°ν λ°μ§λ©΄ λνΌ κ°μ²΄κ° λ΄λΆ κ°μ²΄μ μκΈ° μμ μ μ°Έμ‘°λ₯Ό λκΈ°λ κ²½μ°λ§ μμμ ν΄λΉνλ€.
-
λνΌ ν΄λμ€κ° μ½λ°± νλ μμν¬μλ μ΄μΈλ¦¬μ§ μλλ€λ μ μ μ£Όμνμ. λ΄λΆ κ°μ²΄λ μΈλΆμ μ‘΄μ¬λ₯Ό λͺ¨λ₯΄κ³ μμ μ μ°Έμ‘°λ₯Ό λκΈ°κ² λλ©΄ μ½λ°±λλ λνΌκ° μλ λ΄λΆ κ°μ²΄λ₯Ό νΈμΆνκ² λλ€. μ΄λ₯Ό self λ¬Έμ λΌκ³ νλ€.
-
μμμ λ°λμ νμ ν΄λμ€κ° μμ ν΄λμ€μ βμ§μ§β νμ νμ μΈ μν©μμλ§ μ°μ¬μΌ νλ€. λ€λ₯΄κ² λ§νλ©΄, ν΄λμ€ Bκ° ν΄λμ€ Aμ is-a κ΄κ³μΌ λλ§ ν΄λμ€ Aλ₯Ό μμν΄μΌ νλ€.
-
μ»΄ν¬μ§μ μ μ¨μΌ ν μν©μμ μμμ μ¬μ©νλ 건 λ΄λΆ ꡬνμ λΆνμνκ² λ ΈμΆνλ κΌ΄μ΄λ€. κ·Έ κ²°κ³Ό APIκ° λ΄λΆ ꡬνμ λ¬Άμ΄κ³ κ·Έ ν΄λμ€μ μ±λ₯λ μμν μ νλλ€. λ μ¬κ°ν λ¬Έμ λ ν΄λΌμ΄μΈνΈκ° λ ΈμΆλ λ΄λΆμ μ§μ μ κ·Όν μ μλ€λ μ μ΄λ€.
-
μ»΄ν¬μ§μ μΌλ‘λ μ΄λ° κ²°ν¨μ μ¨κΈ°λ μλ‘μ΄ APIλ₯Ό μ€κ³ν μ μμ§λ§,
μμμ μμ ν΄λμ€μ APIλ₯Ό βκ·Έ κ²°ν¨κΉμ§λβ κ·Έλλ‘ μΉκ³νλ€.
μμμ κ°λ ₯νμ§λ§ μΊ‘μνλ₯Ό ν΄μΉλ€λ λ¬Έμ κ° μλ€.
μμμ μμ ν΄λμ€μ νμ ν΄λμ€κ° μμν is-a κ΄κ³μΌ λλ§ μ¨μΌ νλ€. is-a κ΄κ³μΌ λλ μμ¬ν μλ§μ μλ κ², νμ ν΄λμ€μ ν¨ν€μ§κ° μμ ν΄λμ€μ λ€λ₯΄κ³ , μμ ν΄λμ€κ° νμ₯μ κ³ λ €ν΄ μ€κ³λμ§ μμλ€ λ©΄ μ¬μ ν λ¬Έμ κ° λ μ μλ€.
μμμ μ·¨μ½μ μ νΌνλ €λ©΄ μμ λμ μ»΄ν¬μ§μ κ³Ό μ λ¬μ μ¬μ©νμ.
νΉν λνΌ ν΄λμ€λ‘ ꡬνν μ λΉν μΈν°νμ΄μ€κ° μλ€λ©΄ λμ± κ·Έλ λ€.
λνΌ ν΄λμ€λ νμ ν΄λμ€λ³΄λ€ κ²¬κ³ νκ³ κ°λ ₯νλ€.