Подтвердить что ты не робот

Являются ли "public" и "public final" избыточными для полей интерфейса?


Я читал этот пост. Почему в Java будет использоваться статический вложенный интерфейс? в частности первый ответ. В этом ответе написано, что использование слов "public" или "public final" в полях интерфейса является излишним. Мой вопрос: почему? Почему я должен удалить их? Если у меня есть что-то вроде этого:

public interface Int1 {
   public void add();
   void remove(); 
}

Разве это не значит, что я хочу, чтобы метод add был реализован каким-либо классом, а метод remove - только для классов моего пакета?

4b9b3361

Ответ 1

Являются ли "public" и "public final" избыточными для методов интерфейса?

Да.

Все методы в интерфейсе неявно являются public и abstract (но не final).

Все поля в интерфейсе неявно являются public, static и final.

JLS утверждает это. В нем также говорится, что эти модификаторы могут быть опущены.


Зачем? Ну, есть множество причин:

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

  • Поля являются static потому что если бы они не были, вы бы объявили видимые поля экземпляра на объекте... и это плохо для инкапсуляции.

  • Поля являются final потому что не финальные поля были бы другим способом объявления public static полей... которые ужасны с точки зрения ОО.

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

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

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

Обратите внимание, что в Java 8 вы можете объявить методы в интерфейсе, используя модификатор по default. А в Java 9 вы можете объявить private методы, в некоторых случаях. Но использование public ключевого слова все еще излишне.


Почему я должен удалить их?

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

Разве это не значит, что я хочу, чтобы метод add был реализован каким-либо классом, а метод удаления - только классами моего пакета?

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

Ответ 2

В интерфейсе не может быть объявлен метод final. Поля всегда final, но методы всегда abstract (и никогда final). Вы не можете определить метод интерфейса, который должен быть реализован только классами в одном пакете. * Из раздел 9.3 языка Java Спецификация:

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

и раздел 9.4:

Каждое объявление метода в теле интерфейса неявно открыто (§6.6).

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

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

* Как отмечает Пол Беллора в комментарии, вы можете сделать сам интерфейс приватным (или защищенным или даже закрытым) интерфейсом, если вы хотите ограничить его видимость.

Ответ 3

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

читая это: http://checkstyle.sourceforge.net/config_modifier.html

Ответ 4

Да, публика является избыточной, потому что в Interface все методы являются impictly public и abstract.

Я думаю, что это плохой стиль для добавления public или abstract, потому что оба они неявно применяются.

public interface Int1 {
   void add();
   void remove(); 
}

Это выглядит более чистым и показывает, что вы знаете, что они имплицированы.

из Спецификация языка Java (JLS)

9.4. Абстрактные декларации методов
Каждое объявление метода в теле интерфейса неявно открыто (§6.6).

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

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

Ответ 5

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