Начиная с 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
ключевых слов теперь создаст дополнительную путаницу для тех, кто не знаком с историей того, как интерфейсы получили разные правила использования этих ключевых слов.
источник
default
модификатор илиstatic
модификатор, неявноabstract
... Это разрешено, но не рекомендуется в качестве стиля излишне указыватьabstract
модификатор для объявления такого метода ». Почему вы ожидаете, что все должно измениться?abstract
, становится все более запутанным. В Java 9, то же предложение может быть, «Метод интерфейса отсутствует вdefault
модификатор илиstatic
модификатор илиprivate
модификатор неявно абстрактный ...» Кроме того, вспомогательные аргументы для не явно , используя ключевые слова, а именно, что все методы интерфейса являютсяpublic abstract
, сейчас спорный.stream
кjava.util.Collection
илиMap.getOrDefault()
. Альтернатива состоит в том, чтобы создать новый субинтерфейс и заставить всех упасть, как Graphics2D, и это никому не понравилось!Ответы:
Чтобы развернуть ответ StackOverflow:
public
Модификатор доступа не требуется , посколькуabstract
Модификатор доступа не требуется , посколькуИ...
Учитывая, что методы по умолчанию имеют тело, а те, которые не являются по сути абстрактными, и каждое объявление метода в интерфейсе по своей природе является общедоступным, вам не нужно указывать ни одно ключевое слово.
Один из комментариев к ответу сказал:
Комментарий к вопросу StackOverflow (18 раз проголосовал) опровергает это:
Последствия кода, особенно интерфейсы, важны.
источник
Разве недостаточно неявного выражения оператора блока? Вы бы заявили,
extends Object
хотя это подразумевается?Если разработчик не понимает избыточности, скорее всего, они могут не полностью понять концепцию языковой функции , что является еще большей проблемой, чем путаница с модификаторами.
Разработчик должен понимать, что целью интерфейса является создание контракта, который определяет, как клиент может взаимодействовать с объектом. Это говорит о том, что любой метод интерфейса, используемый для взаимодействия объектов, должен быть доступен клиентам.
Если вы объявляете метод закрытым, вы явно заявляете, что этот метод не предназначен для вызова клиентами, что в случае интерфейсов не может быть легко выведено.
источник
public abstract
прежде, несмотря на стиль полиции, потому что он прояснил ситуацию и напомнил читателю. Теперь я оправдан, потому что Java 8 и 9 все усложняют :-). Java уже достаточно избыточна.extends Object
к каждому классу, который непосредственно происходит отObject
? Это информация, о которой разработчик уже должен знать, поэтому он выводится. Чем меньше бесполезной информации на экране, тем легче обрабатывать важную информацию. Надеюсь, я убедил вас перейти на темную сторону (Получите? Потому что скрытых вещей не видно). Если нет, то это стоило того, ха-ха. В конце концов, все сводится к тому, что делает код проще для разработчикаfinal
перед аргументами метода, если это не требуется для чего-то смешного (например, для анонимного внутреннего класса и т. Д.)extends Object
, но это определенно подняло бы флаг и заставило бы меня задуматься, почему. Как я упоминал в посте, такие действия могут означать, что у разработчика может быть неправильное понимание того, как что-то работает (может не знать, что все объекты уже расширяютсяObject
, отсюда явное расширение)