item 18 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- μ½λ μ¬μ¬μ©μ κ°λ ₯ν μλ¨
- μμ ν΄λμ€μ νμ ν΄λμ€λ₯Ό λͺ¨λ κ°μ νλ‘κ·Έλλ¨Έκ° ν΅μ νλ ν¨ν€μ§ μμμλΌλ©΄ μμλ μμ ν λ°©λ²
- νμ₯ν λͺ©μ μΌλ‘ μ€κ³λμκ³ λ¬Έμνλ μ λ ν΄λμ€λ μμ νλ€.
λ©μλ νΈμΆκ³Ό λ¬λ¦¬ μμμ μΊ‘μνλ₯Ό κΉ¨λ¨λ¦°λ€.
- μμ ν΄λμ€μ λ°λΌ νμ ν΄λμ€μ λμμ μ΄μμ΄ μκΈΈ μ μλ€.
// μμμ μλͺ»λ μ¬μ©
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;
}
// addAll λ©μλλ‘ μμ 3κ°λ₯Ό λνμ κ²½μ°
public static void main(String[] args) {
InstrumentedHashSet<String> s = new InstrumentedHashSet<>();
s.addAll(List.of("ν±", "νν", "ν")); // Arrays.asList
System.out.println(s.getAddCount()); // 3μ λ°νν κ²μΌλ‘ μμνλ 6μ λ°ν
}
}
// HashSetμ addAll λ©μλκ° add λ©μλλ₯Ό μ¬μ©ν΄ ꡬνλ λ° μλ€.
// InstrumentedHashSetμ addAllμ addCountμ 3μ λν ν HashSetμ addAll ꡬνμ νΈμΆ
// νμ ν΄λμ€μμ addAll λ©μλλ₯Ό μ¬μ μ νμ§ μμΌλ©΄ λ¬Έμ λ₯Ό κ³ μΉ μ μλ€.
κΈ°λ³Έ ν΄λμ€λ₯Ό νμ₯νλ λμ μλ‘μ΄ ν΄λμ€λ₯Ό λ§λ€κ³ private νλλ‘ κΈ°μ‘΄ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νκ² νμ.
μ ν΄λμ€μ μΈμ€ν΄μ€ λ©μλλ€μ (private νλλ‘ μ°Έμ‘°νλ) κΈ°μ‘΄ ν΄λμ€μ λμνλ λ©μλλ₯Ό νΈμΆν΄ κ·Έ κ²°κ³Όλ₯Ό λ°ννλ€. (aka μ λ¬)
μ ν΄λμ€μ λ©μλλ€μ μ λ¬ λ©μλλΌκ³ νλ€.
//Wrapper class μμ λμ μ»΄ν¬μ§μ
μ μ¬μ©
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 static void main(String[] args) {
InstrumentedSet<String> s = new InstrumentedSet<>(new HashSet<>());
s.addAll(List.of("ν±", "νν", "ν"));
System.out.println(s.getAddCount());
}
}
// μ¬μ¬μ©ν μ μλ μ λ¬ ν΄λμ€
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μ κ³μΈ΅ κΈ°λ₯μ λ§μμ΄λ€λ λ»μμ Decorator ν¨ν΄μ
// λνΌ κ°μ²΄κ° λ΄λΆ κ°μ²΄μ μκΈ° μμ μ μ°Έμ‘°λ₯Ό λκΈ°λ κ²½μ°λ§ μμμ ν΄λΉνλ€.
- ν¨ν€μ§ λ°κΉ₯μμ μ κ·Όν μ μλ ν΄λμ€λΌλ©΄ μ κ·Όμλ₯Ό μ 곡νλ―λ‘μ¨ ν΄λμ€ λ΄λΆμ νν λ°©μμ μΈμ λ μ§ λ°κΏ μ μμ
- public ν΄λμ€κ° νλλ₯Ό 곡κ°νλ©΄ μ΄λ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈκ° μ겨λ κ²μ΄λ―λ‘ λ΄λΆ νν λ°©μμ λ§μλλ‘ λ°κΏ μ μκ² λλ€.
package-private ν΄λμ€ νΉμ private μ€μ²© ν΄λμ€λΌλ©΄ λ°μ΄ν° νλλ₯Ό λ ΈμΆνλ€ ν΄λ νλΉμ λ¬Έμ κ° μλ€.
- java.awt.package
Point, Dimension class (item 67)
- public ν΄λμ€μ νλκ° λΆλ³μ΄λΌλ©΄ μ§μ λ ΈμΆν λμ λ¨μ μ΄ μ‘°κΈμ μ€μ΄ λ€μ§λ§ APIλ₯Ό λ³κ²½νμ§ μκ³ λ νν λ°©μμ λ°κΏ μ μμ
- νλλ₯Ό μ½μ λ λΆμ μμ μ μνν μ μλ€.
ν΅μ¬ μ 리
ν΄λμ€ Bκ° ν΄λμ€ Aμ is-a κ΄κ³μΌ λλ§ ν΄λμ€ Aλ₯Ό μμν΄μΌ νλ€.
- Aλ B μ€ νλ
- Aλ Bλ₯Ό μμν¨
- Aλ Bμ μλΈν΄λμ€
- Aλ Bμ μμ±μ λͺ¨λ κ³μΉν¨
μμμ κ°λ ₯νμ§λ§ μΊ‘μνλ₯Ό ν΄μΉλ€λ λ¬Έμ
μμ ν΄λμ€κ° νμ₯μ κ³ λ €ν΄ μ€κ³λμ§ μμλ€λ©΄ is-a κ΄κ³μΌ λλ λ¬Έμ κ° λ μ μμ
* μμμ μ·¨μ½μ μ νΌνλ €λ©΄ μμ λμ μ»΄ν¬μ§μ
κ³Ό μ λ¬μ μ¬μ©νμ.