Короткий ответ: в Java нет ничего близкого, как хотелось бы, но есть альтернативы. Шаблон делегата выполнить не сложно, но это не так удобно, как с Objective-C.
Причина, по которой «неофициальные протоколы» работают в Objective-C, заключается в том, что язык поддерживает категории, что позволяет добавлять методы к существующим классам без их подклассификации или даже иметь доступ к исходному коду. Таким образом, большинство неофициальных протоколов являются категорией в NSObject. Это явно невозможно в Java.
Objective-C 2.0 выбирает методы @optional протокола, которые являются намного более чистой абстракцией и предпочитаются для нового кода, но даже от эквивалента в Java.
Честно говоря, наиболее гибким подходом является определение делегатского протокола, а затем классы реализуют все методы. (С современными IDE, такими как Eclipse, это тривиально.) Многие интерфейсы Java имеют сопутствующий класс адаптеров, и это общий подход, поскольку не требует от пользователя реализации множества пустых методов, но он ограничивает наследование, что делает дизайн кода негибким , (Джош Блох обращается к этому в своей книге «Эффективная Java».) Мое предложение состояло в том, чтобы сначала предоставить интерфейс, а затем добавить адаптер, если это действительно необходимо.
Независимо от того, что вы делаете, избегайте метаданных UnsupportedOperationException
для «нереализованных» методов. Это заставляет делегирующий класс обрабатывать исключения для методов, которые должны быть необязательными. Правильный подход заключается в реализации метода, который ничего не делает, возвращает значение по умолчанию и т. Д. Эти значения должны быть хорошо документированы для методов, которые не имеют типа возврата void.
Throwing 'UnsupportedOperationException' - страшная идея! API никогда не должны заставлять пользователей иметь дело с исключениями в обычных шаблонах использования, только для исключительного потока. Шаблон делегирования в Cocoa является надежным в том, что он молча пропускает нереализованные методы делегата. –
Очень хорошая точка. Я забыл, как раздражают исключения Java. –
@Quinn Taylor: однако, это то, что «факультативные» протоколы * были выполнены во многих частях библиотеки Java. Например, интерфейс «Коллекция» указывает, что такие методы, как add() и remove(), являются «необязательными операциями», которые вызывают UnsupportedOperationException, если они не поддерживают его. – newacct