Интерфейс никогда не может быть разыменован статически, например, ISomething.member
. Интерфейс всегда разыменовывается через переменную, которая ссылается на экземпляр подкласса интерфейса. Таким образом, ссылка на интерфейс никогда не может знать, на какой подкласс он ссылается, без экземпляра своего подкласса.
Таким образом, самым близким приближением к статическому методу в интерфейсе будет нестатический метод, который игнорирует «this», то есть не обращается к каким-либо нестатическим элементам экземпляра. На низкоуровневой абстракции каждый нестатический метод (после поиска в любой vtable) на самом деле является просто функцией с областью действия класса, которая принимает «this» в качестве неявного формального параметра. См. одноэлементный объект Scala и совместимость с Java в качестве доказательства этой концепции.
И, таким образом, каждый статический метод является функцией с областью действия класса, которая не принимает параметр «this». Таким образом, обычно статический метод может вызываться статически, но, как было указано ранее, интерфейс не имеет реализации (является абстрактным).
Таким образом, чтобы получить наиболее близкое приближение к статическому методу в интерфейсе, нужно использовать нестатический метод, а затем не обращаться ни к одному из нестатических элементов экземпляра. Никакого другого выигрыша в производительности не будет, потому что нет способа статически связать (во время компиляции) ISomething.member()
. Единственное преимущество, которое я вижу от статического метода в интерфейсе, состоит в том, что он не будет вводить (то есть игнорировать) неявное «это» и, таким образом, запрещать доступ к любому из нестатических элементов экземпляра. Это неявно заявило бы, что функция, которая не имеет доступа к «this», является иммутированной и даже не только для чтения по отношению к содержащему ее классу. Но объявление «static» в интерфейсе ISomething
также может запутать людей, которые пытаются получить к нему доступ ISomething.member()
, что может вызвать ошибку компиляции. Я полагаю, если бы ошибка компилятора была достаточно объяснительной, это было бы лучше, чем пытаться обучить людей использованию нестатического метода для достижения того, чего они хотят (по-видимому, в основном заводские методы), как мы делаем здесь (и повторялось для 3 Вопросы и ответы на этом сайте), так что это, очевидно, проблема, которая не является интуитивно понятной для многих людей. Мне пришлось немного подумать об этом, чтобы получить правильное понимание.
Чтобы получить изменяемое статическое поле в интерфейсе, используйте нестатические методы получения и установки в интерфейсе, чтобы получить доступ к тому статическому полю в подклассе. Sidenote, по-видимому, неизменяемая статика может быть объявлена в интерфейсе Java с помощью static final
.