Почему нужно объявлять метод интерфейса Java как абстрактный? - PullRequest
139 голосов
/ 13 марта 2009

Сегодня я использовал функцию рефакторинга "pull interface" Eclipse, чтобы создать интерфейс на основе существующего класса. В диалоговом окне предлагается создать все новые методы нового интерфейса как «абстрактные» методы.

Какая польза от этого?

Я думал, что тот факт, что вам разрешено объявлять методы интерфейса как абстрактные, является излишней и безвредной особенностью языка, которая не особенно поощряется.

Почему Eclipse поддерживает такой стиль или почему кто-то добровольно решит это сделать?

Пояснение: я не спрашиваю, почему интерфейсные методы абстрактны, это очевидно. Я спрашиваю, почему кто-то явно выбрал пометить их как абстрактные, поскольку, если они находятся в интерфейсе, они в любом случае являются абстрактными.

Ответы [ 4 ]

142 голосов
/ 13 марта 2009

Согласно Спецификации языка Java , ключевое слово abstract для интерфейсов устарело и больше не должно использоваться. (Раздел 9.1.1.1)

Тем не менее, учитывая склонность Java к обратной совместимости, я действительно сомневаюсь, что когда-либо будет иметь значение наличие ключевого слова abstract.

38 голосов
/ 13 марта 2009

«Преимущество этого» (добавление тезисов при объявлении методов интерфейса) в eclipse - это старая проблема совместимости с компилятором jdt eclipse в jdk1.3

Начиная с версии 1.4, библиотеки jdk больше не содержат абстрактные методы по умолчанию (в абстрактных классах, реализующих интерфейсы).
Это обманывает диагностику компилятора Eclipse 1.3, поскольку их реализация зависит от их существования.
Обратите внимание, что Javac 1.3 полностью отказывается работать с библиотеками 1.4 (используя опцию -bootclasspath).

Поскольку компилятор Eclipse, вероятно, находится на уровне соответствия 1.4 (см. Workbench>Preferences>Java>Compiler>JDK Compliance) или использует как минимум 1,3 библиотеки классов, если используется режим соответствия 1.3, присутствие «абстрактного» не требуется в большинстве текущих затмений проекты.

37 голосов
/ 13 апреля 2012

Из Java SE 7 JLS (спецификация языка Java): «Разрешается, но не рекомендуется в качестве стиля, избыточно указывать открытый и / или абстрактный модификатор для метода, объявленного в интерфейс. "

Для Java SE 5.0 : «Для совместимости со старыми версиями платформы Java разрешается, но не рекомендуется, из соображений стиля, избыточно указывать абстрактный модификатор для методов, объявленных в интерфейсах».

9 голосов
/ 13 марта 2009

Согласно JLS методы в интерфейсах являются абстрактными по умолчанию, поэтому ключевое слово является избыточным. Зная это, я бы никогда не использовал это, чтобы «избежать беспорядка представления».

...