Dziedziczenie i kompozycja - rlip/java GitHub Wiki

Dziedziczyć tylko jak jeden obiekt jest uszczegółowieniem 2, w przeciwnym wypadku lepiej robić kompozycję czyli w 2 obiekcie ma być pole prywatne z tym 1, najlepiej jeszcze jak będzie klasa osłonkowa, chroni ona wtedy przed jakimiś zmianami w klasie głównej.

// Klasa osłonowa - korzysta z kompozycji zamiast dziedziczenia
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;
}
}
// Klasa przekazująca wielokrotnego użytku
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 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>[] 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<Instant> times = new InstrumentedSet<>(new TreeSet<>(cmp));
Set<E> s = new InstrumentedSet<>(new HashSet<>(INIT_CAPACITY));
⚠️ **GitHub.com Fallback** ⚠️