Должны ли методы в интерфейсе Java объявляться с модификатором открытого доступа или без него?

StackOverflow https://stackoverflow.com/questions/161633

Вопрос

Должны ли методы в интерфейсе Java объявляться с или без public модификатор доступа?

Технически это не имеет значения, конечно.Метод класса, реализующий interface всегда public.Но какое соглашение лучше?

Сама Java в этом не последовательна.См. например Collection против. Comparable, или Future против. ScriptEngine.

Это было полезно?

Решение

А JLS проясняет это:

Разрешается, но не рекомендуется из соображений стиля, излишне указывать public и/или abstract модификатор метода, объявленного в интерфейсе.

Другие советы

Модификатор public следует опускать в интерфейсах Java (на мой взгляд).

Поскольку он не добавляет никакой дополнительной информации, он просто отвлекает внимание от важного.

Большинство руководств по стилю рекомендуют вам не использовать его, но, конечно, самое главное — обеспечить единообразие всей вашей кодовой базы, и особенно для каждого интерфейса.Следующий пример может легко запутать человека, не владеющего Java на 100%:

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}

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

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

Во-вторых, хотя можно инициировать объекты типа интерфейса, но интерфейс реализуется классами, которые его реализуют, а не наследуется.А поскольку интерфейс может быть реализован (реализован) разными несвязанными классами, которые не находятся в одном пакете, модификатор защищенного доступа также недопустим.Итак, что касается модификатора доступа, у нас остается только публичный выбор.

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

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

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

С введением private, static, default модификаторы для методов интерфейса в Java 8/9, все становится сложнее, и я склонен думать, что полные объявления более читабельны (для компиляции требуется Java 9):

public interface MyInterface {

    //minimal
    int CONST00 = 0;
    void method00();
    static void method01() {}
    default void method02() {}
    private static void method03() {}
    private void method04() {}

    //full
    public static final int CONST10 = 0;
    public abstract void method10();
    public static void method11() {}
    public default void method12() {}
    private static void method13() {}
    private void method14() {}

}

Я бы не стал ставить модификаторы, которые применяются по умолчанию.Как уже отмечалось, это может привести к противоречиям и путанице.

Худшее, что я видел, это интерфейс с объявленными методами abstract...

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

Так что я не совсем уверен, что лучше, но одна вещь, которая мне действительно не нравится, — это использование public abstract по методам интерфейса.Eclipse иногда делает это при рефакторинге с помощью «Extract Interface».

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

Я предпочитаю это пропустить, где-то читал, что интерфейсы есть по умолчанию, public и abstract.

К моему удивлению, книга - Шаблоны проектирования с головой вперед, использует public с объявлением интерфейса и методами интерфейса...это заставило меня еще раз переосмыслить, и я остановился на этом посте.

В любом случае, я считаю, что избыточную информацию следует игнорировать.

Я не согласен с популярным ответом, что публичность подразумевает, что есть другие варианты, и поэтому ее не должно быть.Дело в том, что теперь с Java 9 и выше ЕСТЬ другие варианты.

Я думаю, что вместо этого Java должна обеспечивать/требовать указания «public».Почему?Потому что отсутствие модификатора означает «пакетный» доступ повсюду, а использование этого как особого случая приводит к путанице.Если вы просто сделали это ошибкой компиляции с четким сообщением (например.«Доступ к пакету в интерфейсе запрещен».) мы бы избавились от очевидной двусмысленности, которую вносит возможность исключить слово «public».

Обратите внимание на текущую формулировку: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4

«Метод в теле интерфейса может быть объявлен общественный или частный (п.6.6).Если модификатор доступа не указан, метод неявно является общедоступным.Это разрешено, но не рекомендуется в стиле, избыточно указать общественный модификатор для объявления метода в интерфейсе ».

Посмотрите, что «частное» разрешено сейчас.Я думаю, что последнее предложение следовало бы удалить из JLS.К сожалению, «неявно публичное» поведение когда-либо было разрешено, поскольку теперь оно, вероятно, останется для обратной совместимости и приведет к путанице, поскольку отсутствие модификатора доступа означает «публичный» в интерфейсах и «пакет» в других местах.

Причина, по которой методы в интерфейсах по умолчанию являются общедоступными и абстрактными, кажется мне вполне логичной и очевидной.

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

Добавление этих модификаторов в ваш код является излишним и бесполезным и может привести только к выводу, что вам не хватает знаний и/или понимания основ Java.

Это абсолютно субъективно.Я опускаю лишнее public модификатор, так как это кажется беспорядком.Как уже упоминалось другими, последовательность является ключом к этому решению.

Интересно отметить, что разработчики языка C# решили обеспечить соблюдение этого правила. Объявление метода интерфейса как общедоступного в C# на самом деле является ошибкой компиляции. Однако согласованность, вероятно, не важна для разных языков, поэтому я думаю, что это не имеет прямого отношения к Java.

Люди изучат ваш интерфейс, дополняя код в своей IDE или в Javadoc, а не читая исходный код.Так что нет смысла ставить в исходнике слово «общедоступный» — исходник никто не читает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top