Переглядаючи рамки колекцій Java, я помітив, що досить багато інтерфейсів мають коментар (optional operation). Ці методи дозволяють реалізовувати класи, UnsupportedOperationExceptionякщо вони просто не хочуть реалізувати цей метод.
Прикладом цього є addAllметод у Set Interface.
Тепер, як зазначено в цій серії питань, інтерфейси є визначальним договором того, що використання може очікувати.
Інтерфейси важливі, оскільки вони відокремлюють те, що робить клас від того, як це робить. Договір, що визначає, на що клієнт може розраховувати, залишає розробника вільним для його реалізації будь-яким способом, який він обрав, доки він підтримує контракт.
і
Інтерфейс - це опис дій, які може виконувати об’єкт ... наприклад, коли ви перемикаєте перемикач світла, світло вимикається, вам не байдуже, як це відбувається. В об'єктно-орієнтованому програмуванні інтерфейс - це опис усіх функцій, які повинен мати об'єкт, щоб бути "X".
і
Я думаю, що підхід на основі інтерфейсу значно приємніший. Потім ви зможете добре знущатися зі своїх залежностей, і все в основному менш щільно пов'язане.
Інтерфейс + розширення (mixin) проти базового класу
Враховуючи, що мета інтерфейсів полягає у визначенні контракту та узалежненні ваших залежностей, чи не маючи якихось методів нанести певну UnsupportedOperationExceptionпоразку меті? Це означає, що я більше не можу передаватись Setта просто користуватися addAll. Швидше, я повинен знати, яку реалізацію Setя пройшов, тому я можу знати, чи можу я використовувати, addAllчи ні. Мені це здається зовсім нікчемним.
Тож у чому сенс UnsupportedOperationException? Це просто заповнення застарілого коду, і їм потрібно очистити свої інтерфейси? Або це має більш чуттєве призначення, яке мені не вистачає?
src.zipцим, він працює чудово. Це допомагає точно знати, який код інколи працює JRE, а не відкладати на JavaDoc, що може бути трохи багатослівним.
addAllвHashSet. Він відкладає до типової реалізації, вAbstractCollectionяку більшість точно не кидаєтьсяUnsupportedOperationException.