Переменные в интерфейсе - PullRequest
       31

Переменные в интерфейсе

11 голосов
/ 07 декабря 2009

Почему переменная, используемая в интерфейсе, является ОБЩЕСТВЕННОЙ СТАТИЧЕСКОЙ ФИНАЛЬНОЙ? Почему именно "статический"?

Ответы [ 5 ]

21 голосов
/ 07 декабря 2009

Поле, объявленное в интерфейсе, в любом случае может быть только константой, так почему оно зависит от того, какой экземпляр вы используете для доступа к нему?

В любом случае размещение полей в интерфейсах зачастую является плохим стилем. Интерфейс предназначен для отражения возможностей классов, которые его реализуют, что полностью ортогонально идее константы. Конечно, это плохая идея использовать интерфейс просто для объявления группы констант. Иногда я нахожу полезным, чтобы тип интерфейса представлял константы, которые являются простыми реализациями - так, например, интерфейс фильтрации может иметь поля «ALLOW_ALL» и «ALLOW_NONE».

Полагаю, вы могли бы представить сценарий, в котором реализация интерфейса действительно фактически добавила поле экземпляра в ваш класс - но это нарушило бы инкапсуляцию не только с точки зрения ее неявного public, но также указав часть реализации вместо API.

6 голосов
/ 07 декабря 2009

Потому что вы не можете создать экземпляр интерфейса. Также не может быть тела метода для использования нестатической не финальной переменной.

3 голосов
/ 07 декабря 2009

Основная причина, по-моему, это детали реализации виртуальной машины / языка.

Если интерфейсу не разрешено иметь нестатические переменные, нет необходимости выделять память для интерфейса во время создания класса. Также нет необходимости в специальных механизмах именования / переименования, если вы наследуете переменные с одинаковыми именами. Единственное, что вам нужно, это какая-то таблица для вызова правильных функций при использовании интерфейса.

Короче говоря - это облегчает жизнь сопровождающему языка / виртуальной машины. Если вы действительно хотите взглянуть на множественное наследование, его подводные камни и ловушки, прочтите «Построение объектно-ориентированного программного обеспечения» Бертрана Мейера (2-е издание). Затем вы понимаете, почему интерфейс должен быть таким простым (и в то же время архивировать большинство вещей, которые делает множественное наследование).

3 голосов
/ 07 декабря 2009

Почему бы не быть статичным?

Это константа, связанная с интерфейсом, а не с каким-то конкретным экземпляром.

2 голосов
/ 31 января 2015

Интерфейсом является контракт , который определяет взаимодействие между объектами.

Это взаимодействие определяется открытыми методами, а не переменными. Переменные будут описывать только внутреннюю работу, а не взаимодействие.

Обратите внимание, что переменные никогда не должны использоваться для взаимодействия. В соответствии с принципом ООП инкапсуляция было бы преступлением разрешать 1 классу обращаться к переменной другого класса напрямую.

Константы (например, Math.PI) являются единственным допустимым исключением. Поскольку константы являются единственным видом переменных, к которым другие классы могут обращаться напрямую, не нарушая принцип инкапсуляции , все переменные в интерфейсе обрабатываются как public static final переменные (т.е. константы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...