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

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

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". Компилятор Java жалуется на этот код. Это пишет что класс IServiceAnnouncer общедоступно, и это должно быть объявлено в файле под названием "IServiceAnnouncer.java".

У меня есть несколько вопросов об этом:

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

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

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

9
задан Roman 4 July 2013 в 22:15
поделиться

6 ответов

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

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

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

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

16
ответ дан 4 December 2019 в 08:00
поделиться

Эти ответы пляшут вокруг правильного.

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

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

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

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

4
ответ дан 4 December 2019 в 08:00
поделиться

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

6
ответ дан 4 December 2019 в 08:00
поделиться

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

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

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

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

2
ответ дан 4 December 2019 в 08:00
поделиться
  1. Проблема с более чем одним определением класса в одном файле заключается в следующей ошибке, которая может возникнуть при использовании Versioning и работе нескольких разработчиков над одним проектом:

    дублирующий класс: X
    класс X {
    

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

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

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

0
ответ дан 4 December 2019 в 08:00
поделиться

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

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

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

-1
ответ дан 4 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: