Почему «final» не разрешен в интерфейсных методах Java 8?
Одной из самых полезных функций 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?