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


14

Начиная с Java 8, defaultметоды были введены в интерфейсы. Фактически, это означает , что не все методы в interfaceэто abstract.

Начиная с Java 9 (возможно), privateметоды будут разрешены. Это означает , что не все методы в interfaceэто public abstract.

Вопрос "Должны ли методы в интерфейсе Java быть объявлены с publicмодификатором доступа или без него ?" был задан вопрос о переполнении стека на /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m

Там, в большинстве ответов утверждается, что public abstractне следует использовать, потому что ни один метод не interfaceможет быть ничем, кроме public abstract. Это уже не так.

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

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


5
Вы проверяли Java 8 JLS? Тот же раздел, что и в старом принятом ответе в SO, предполагает, что введение методов по умолчанию не изменило предыдущую рекомендацию, основанную на тех же соображениях избыточности: «Интерфейсный метод, в котором отсутствует defaultмодификатор или staticмодификатор, неявно abstract... Это разрешено, но не рекомендуется в качестве стиля излишне указывать abstractмодификатор для объявления такого метода ». Почему вы ожидаете, что все должно измениться?
Комнат

3
Я думал, что все может измениться, потому что условие для того, чтобы метод был неявным abstract, становится все более запутанным. В Java 9, то же предложение может быть, «Метод интерфейса отсутствует в defaultмодификатор или staticмодификатор или privateмодификатор неявно абстрактный ...» Кроме того, вспомогательные аргументы для не явно , используя ключевые слова, а именно, что все методы интерфейса являются public abstract, сейчас спорный.
Дэвид Кэмпбелл

TBH Я не понимаю причин, лежащих в основе методов «по умолчанию», и даже статические методы выходят за рамки того, для чего обычно предназначены интерфейсы. Интерфейсы не должны быть обременены бетонированием. Вот почему они полезные типы для ссылок.
Трикси Вольф

1
Методы @TrixieWolf по умолчанию позволяют развиваться интерфейсам. Ранее, в отличие от классов, добавление метода нарушало бы каждую реализацию; Теперь вы можете расширить интерфейс, если у вас есть подходящий кандидат по умолчанию. Рассмотрите добавление streamк java.util.Collectionили Map.getOrDefault(). Альтернатива состоит в том, чтобы создать новый субинтерфейс и заставить всех упасть, как Graphics2D, и это никому не понравилось!
СьюзенWW

Ответы:


2

Чтобы развернуть ответ StackOverflow:

  1. publicМодификатор доступа не требуется , поскольку

    Каждое объявление метода в теле интерфейса неявно общедоступно (§6.6). Разрешается, но не рекомендуется в качестве стиля, избыточно указывать открытый модификатор для объявления метода в интерфейсе. ( Раздел 9.4 )

  2. abstractМодификатор доступа не требуется , поскольку

    Метод по умолчанию - это метод, который объявлен в интерфейсе с модификатором по умолчанию; его тело всегда представлено блоком .

    И...

    Метод интерфейса, в котором отсутствует модификатор по умолчанию или статический модификатор, является неявно абстрактным , поэтому его тело представляется точкой с запятой , а не блоком.

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


Один из комментариев к ответу сказал:

Не заставляй их думать! Я всегда добавлял публичные тезисы раньше, несмотря на стиль полиции, потому что он прояснил ситуацию и напомнил читателю. Теперь я оправдан, потому что Java 8 и 9 усложняют вещи (user949300)

Комментарий к вопросу StackOverflow (18 раз проголосовал) опровергает это:

Это плохо, потому что написание этого как публичного означает, что это может быть непубличным (Pacerier)

Последствия кода, особенно интерфейсы, важны.


Комментарий, который вы цитировали в StackOverflow, устарел. Сказать, что добавление публичного модификатора - плохая запись, поскольку подразумевает, что он может быть закрытым, противоречиво. Метод может быть закрытым.
Дэвид Кэмпбелл

@DavidCampbell: Ну, я думаю, этот вопрос лучше задать после выхода Java 9. :) Еще не завершенная спецификация Java может ответить на этот вопрос.
Грег Бургхардт

1

Разве недостаточно неявного выражения оператора блока? Вы бы заявили, extends Objectхотя это подразумевается?

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

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

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


2
Не заставляй их думать! Я всегда добавлял public abstractпрежде, несмотря на стиль полиции, потому что он прояснил ситуацию и напомнил читателю. Теперь я оправдан, потому что Java 8 и 9 все усложняют :-). Java уже достаточно избыточна.
user949300

1
@ user949300 Вы бы также добавили extends Objectк каждому классу, который непосредственно происходит от Object? Это информация, о которой разработчик уже должен знать, поэтому он выводится. Чем меньше бесполезной информации на экране, тем легче обрабатывать важную информацию. Надеюсь, я убедил вас перейти на темную сторону (Получите? Потому что скрытых вещей не видно). Если нет, то это стоило того, ха-ха. В конце концов, все сводится к тому, что делает код проще для разработчика
Винс Эми

@ user949300 Делая это, вы, скорее всего, создаете путаницу в том, что это значит, когда методы интерфейса не содержат этих объявлений. то есть, если есть какие-то разработчики, изучающие Java на основе просмотра вашего кода, вы потенциально затрудняете их понимание синтаксиса объявлений интерфейса.
JimmyJames

Винс, нет, я бы не стал расширять Object, хотя я не бросаю вызов, когда вижу код, который это делает. @JimmyJames, если кто-то последовательно добавляет публичные тезисы к таким предметам, я не вижу никакой путаницы. Я что-то пропустил? ОТО, я вижу вашу точку зрения на беспорядок. Например, я не добавляю finalперед аргументами метода, если это не требуется для чего-то смешного (например, для анонимного внутреннего класса и т. Д.)
user949300

@ user949300 Он имеет в виду, что если пользователь уже столкнулся с отсутствием модификаторов и его причиной, они могут задаться вопросом, почему модификаторы присутствуют, когда они их видят, заставляя их предположить, что за этим может быть реальная причина, а не просто , Я не бросил бы приступ, если бы увидел extends Object, но это определенно подняло бы флаг и заставило бы меня задуматься, почему. Как я упоминал в посте, такие действия могут означать, что у разработчика может быть неправильное понимание того, как что-то работает (может не знать, что все объекты уже расширяются Object, отсюда явное расширение)
Винс Эми
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.