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

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

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

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

Ответ 1

JLS делает это ясно:

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

Ответ 2

Общественный модификатор должен быть опущен в интерфейсах Java (на мой взгляд).

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Итак, я не совсем уверен, что лучше всего, но мне очень не нравится использование методов public abstract для интерфейса. Eclipse делает это иногда при рефакторинге с "Extract Interface".

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

С введением модификаторов 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() {}

}

Ответ 11

Люди узнают ваш интерфейс от завершения кода в своей среде IDE или в Javadoc, а не от чтения источника. Поэтому нет смысла ставить "публичный" в источник - никто не читает источник.