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

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

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

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

11 ответов


на JLS об этом ясно:

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


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

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

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

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

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

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

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

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

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

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


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

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


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

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


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


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

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

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


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

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

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


введение 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() {}

}

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

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


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