Действующий элемент Java 16 (2-е издание). Используется ли класс Forwarding только для повторного использования? - PullRequest
0 голосов
/ 15 сентября 2018

Я прохожу через Effective Java, Item-16 Favor composition over inheritance.Я посмотрел на Forwarding class пример ниже.

Мне интересно, какой смысл иметь класс ForwardingSet?InstrumentedSet может очень хорошо реализовать Set и иметь частный экземпляр этого, который вызывает все методы.

Будет ли способствовать повторному использованию и предотвращать избыточность, если в будущем у нас будет больше InstrumentedSet классов, которые просто должны сделать что-то в дополнение к базовому поведению?Это просто дизайн будущего или есть что-то еще, чего мне не хватает?

// Reusable forwarding class 
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); }
...
}

// Wrapper class - uses composition in place of inheritance   
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);
       }
       ...
    }

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Это для того, чтобы способствовать повторному использованию и предотвратить избыточность? Да.
Это просто дизайн будущего? Да.
Есть личто-то еще, что мне не хватает? Нет.

"Переадресация" обычно называется " делегирование ".
См .: Что такоеназначение шаблона делегирования?

Некоторые примеры классов Java с реализациями только для делегатов:

0 голосов
/ 15 сентября 2018

Да, ForwardingSet - это фреймворк.

Если вам нужно написать несколько Set, которые работают с другими Set внутренне, но предоставляют различные функции поверх "ванили" Set, вам лучше написать общую часть один раз, а не несколько раз .

Джошуа Блох, в Effective Java именует его «композицией», хотя фактическая реализация больше похожа на шаблон декоратора .

Фактическая реализация легко доступна в Guava как класс с именем ForwardingSet.

Будет ли способствовать повторному использованию и предотвращать избыточность, если в будущем у нас будет больше классов, подобных InstrumentedSet, которым просто нужно что-то делать в дополнение к базовому поведению?

Да.

Это просто дизайн будущего?

Да.

или есть что-то еще, чего мне не хватает?

Нет, вы ничего не упускаете.

...