Почему объявить метод интерфейса Java абстрактным?

Я использовал функцию рефакторинга "pull interface" для Eclipse сегодня для создания интерфейса на основе существующего класса. Диалоговое окно предложило создать все новые методы нового интерфейса как абстрактные методы.

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

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

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

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

Ответ 1

В соответствии с Java Language Specification ключевое слово abstract для интерфейсов устарело и больше не должно использоваться. (Раздел 9.1.1.1)

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

Ответ 2

"Прибыль от этого" (добавление абстрактного описания декларации интерфейсов) в 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, наличие "абстрактного" не требуется в большинстве текущих затмений проектов.

Ответ 3

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

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

Ответ 4

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