Тепер, коли не всі декларації методів у Java-інтерфейсі є публічними абстрактними, чи слід оголошувати методи за допомогою цих модифікаторів?


14

Починаючи з Java 8, defaultметоди були введені в інтерфейси. Ефективно це означає, що interfaceдалеко не всі методи у abstract.

Починаючи з Java 9 (можливо), privateметоди будуть дозволені. Це означає, що interfaceдалеко не всі методи є public abstract.

Питання "Чи повинні бути оголошені методи в інтерфейсі Java з publicмодифікатором доступу або без нього ?" запитували у стеку Overflow на /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 Я не розумію міркування методів "за замовчуванням", і навіть статичні методи виходять за межі того, що інтерфейси зазвичай призначені робити. Інтерфейси не повинні бути заповнені бетоном. Ось чому вони корисні типи для довідок.
Trixie Wolf

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

Відповіді:


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 ускладнюють речі :-). Ява вже надмірна.
user949300

1
@ user949300 Ви також додали б extends Objectдо кожного класу, який безпосередньо походить Object? Це інформація, яку розробник повинен уже усвідомлювати, і саме тому виводиться з неї. Чим менше марної інформації на екрані, тим простіше обробляти важливу інформацію. Сподіваюся, я переконав вас підійти до темної сторони (Зрозумійте? Тому, що неявні речі не видно). Якщо ні, то варто було вистрілити ха-ха. Врешті-решт, це зводиться до того, що полегшує управління кодом для розробника
Vince Emigh

@ user949300 Роблячи це, ви більше схильні створювати плутанину щодо того, що це означає, коли методи інтерфейсу не містять цих декларацій. тобто, якщо є якісь розробники, які навчаються Java, переглянувши ваш код, ви потенційно змогли зрозуміти синтаксис оголошень інтерфейсу.
JimmyJames

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

@ user949300 Він має на увазі, якщо користувач вже зазнав відсутності модифікаторів і причини, що їх викликають, вони можуть поставити під сумнів, чому модифікатори є, коли вони бачать їх, змушуючи припустити, що за ним може бути фактична причина, а не просто явна . Я б не кидав придатність, якби бачив extends Object, але це обов'язково підніме прапор і змусить мене запитати, чому. Як я вже згадував у публікації, робити такі речі може означати, що у розробника може виникнути непорозуміння того, як щось працює (може не знати, що всі об’єкти вже поширюються Object, отже, явне розширення)
Vince Emigh,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.