И всетаки, почему все переменные в интерфейсе являются final? Для чего это ключевое слово тут? В чем его смысл?
Для чего вообще это ключевое слово там?
Пусть бы они были не final!
Что тогда?
Ответ
Интерфейс определяет поведение объектов, а не конкретную реализацию. Если бы мы могли переопределять значения в дочерних интерфейсах или классах, реализующих этот интерфейс, то часть нашего интерфейса становилась бы частью конкретной реализации, что нарушало бы исходное понятие термина "интерфейс".
Поскольку создавать экземпляры интерфейса нельзя и интерфейс не должен быть связан с конкретной реализацией, то неявно используется ключевое слово static (то есть данное поле определено в контексте, где нет никаких объектов). Отсутствие модификатора final также приводило бы к неоднозначности и путанице, поскольку каждый класс/интерфейс мог бы по своему усмотрению изменять это значение, что влияло бы на другие классы/интерфейсы. Но тут стоит заметить, что неизменяемость характерна для примитивных типов данных и immutable классов, для остальных же классов - final гарантирует только неизменяемость ссылки на область памяти, в которой расположен объект. Поля самого объекта при этом могут быть изменяемы.
Если предположить возможность, что интерфейс может иметь нестатические изменяемые поля, то тогда бы возникла проблема с ромбовидным наследованием (diamond inheritance). Допустим, есть интерфейс A, в котором определено поле int v = 10. От этого интерфейса наследуются два других интерфейса B и C, каждый из которых переопределяет нашу переменную v (например, в B имеем значение 15, а в C - 20). Теперь мы определяем еще один интерфейс D, который наследуется от B и C. Тогда возникает вопрос: какое значение поле v должно унаследовать?
Комментариев нет:
Отправить комментарий