Одной из наиболее полезных функций Java 8 являются новые методы default
на интерфейсах. Есть по существу две причины (могут быть и другие), почему они были введены:
- Предоставление фактических реализаций по умолчанию. Пример:
Iterator.remove()
- Разрешение на развитие JDK API. Пример:
Iterable.forEach()
С точки зрения дизайнера API мне бы хотелось использовать другие модификаторы для методов интерфейса, например. final
. Это было бы полезно при добавлении удобных методов, предотвращающих "случайные" переопределения при реализации классов:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Вышеприведенная практика является обычной практикой, если Sender
был классом:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Теперь default
и final
явно противоречат ключевым словам, но ключевое слово по умолчанию не было бы строго обязательным, поэтому я предполагаю, что это противоречие преднамеренное, чтобы отразить тонкие различия между "методами класса с телом" (только методы) и "интерфейсные методы с телом" (методы по умолчанию), то есть различия, которые я еще не понял.
В некоторый момент времени поддержка модификаторов, таких как static
и final
по методам интерфейса, еще не была полностью изучена, со ссылкой на Брайана Гетца:
Другая часть - это то, как далеко мы собираемся идти на поддержку классового строительства инструменты в интерфейсах, такие как конечные методы, частные методы, защищенные методы, статические методы и т.д. Ответ: мы еще не знаем
С тех пор в конце 2011 года, очевидно, была добавлена поддержка методов static
в интерфейсах. Очевидно, что это добавило большую ценность самим библиотекам JDK, таким как Comparator.comparing()
.
Вопрос:
В чем причина того, что final
(а также static final
) никогда не попадал на интерфейсы Java 8?