Должен ли я поместить открытый интерфейс в отдельный файл?

у меня есть следующий код:

import com.apple.dnssd.*;

public interface IServiceAnnouncer {
    public void registerService();
    public void unregisterService();
    public boolean isRegistered();
}

class HelloWorld {
        public static void main(String[] args) {
                System.out.println("Hello, World!");
        }
}

этот код сохраняется в файле под названием " HelloWorld.ява." Компилятор Java жалуется на этот код. Он пишет, что класс IServiceAnnouncer является общедоступным, и он должен быть объявлен в файле с именем "IServiceAnnouncer.ява."

у меня несколько вопросов по этому поводу:

  1. почему компилятор сказал, что IServiceAnnouncer - это класс? Это интерфейс. Или интерфейс является частичным случаем класс?

  2. если я поставлю интерфейс IServiceAnnouncer в отдельном файле под названием "IServiceAnnouncer.java " (как хочет компилятор), как тогда я могу использовать его из "HelloWorld.java"?

  3. Что значит public interface в смысле? В чем разница между публичным и непубличным интерфейсом?

6 ответов


вы должны поместить его в отдельный файл. Таким образом, проще поменять местами в другой реализации или сделать интерфейсы (API вашей системы) доступными для других, чтобы кодировать, не зная деталей вашей реализации или перетаскивая связанные зависимости.

например, реализации общих API Java - например, сервлеты - будут иметь реализацию, закодированную против пакета интерфейсов, предоставляемых Sun (в этом случае javax.servlet)

Как может вы используете его из своей реализации ? Импортируя его. Это не нужно, если он находится в одном пакете, и вы компилируете все свои интерфейсы/реализации сразу.

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


У вас нет выбора. Все открытые классы / интерфейсы должны находиться в файлах с именем ClassOrInterfaceName.Ява.


эти ответы танцуют вокруг правой.

  1. Да, вы можете объявить несколько классов в одном файле на Java.
  2. вы не можете объявить более одного открытого класса, потому что:
  3. имя открытого класса должно совпадать с именем файла, содержащего его; это ваша ошибка компиляции

в Java очень странно объявлять несколько классов в одном файле, даже если вы можете. Не делай этого.

вы ставите IServiceAnnouncer в отдельный файл и импортируйте имя класса в HelloWorld.Ява. Вы просто компилируете их одновременно, передавая оба имени файлов javac. Это все работает.

открытый интерфейс, как и все остальное, что является общедоступным в Java, является типом, который виден и может использоваться из любого другого класса. Без "public" его видимость называется package-private, что означает, что его могут использовать только вещи в одном пакете.


компилятор использует термин "класс" немного свободно. Более общим термином может быть "тип". Я предполагаю, что компилятор использует термин "класс", потому что он производит".class " файлы одного формата из каждого объявления типа (class, interface и enum).

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

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

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


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

    duplicate class: X
    class X {
    

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

  2. если он находится в той же папке, просто используйте IServiceAnnouncer, если он находится в другой папке, import его.

  3. public виден из всех пакетов. Нет!--3--> означает своего рода protected (в то время как ключевое слово protected запрещено, странно ха!): это видно только изнутри того же пакета. Если вы не знаете, что такое пакет, ознакомьтесь с учебником Java. http://java.sun.com/docs/books/tutorial/java/package/packages.html


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

2) вам нужно либо реализовать интерфейс, либо иметь доступ к объекту, который его реализует.

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