Должен ли я поместить публичный интерфейс в отдельный файл? - PullRequest
9 голосов
/ 06 марта 2010

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

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? В чем разница между открытым и закрытым интерфейсом?

Ответы [ 6 ]

15 голосов
/ 06 марта 2010

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

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

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

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

6 голосов
/ 06 марта 2010

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

4 голосов
/ 06 марта 2010

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

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

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

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

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

2 голосов
/ 06 марта 2010

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

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

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

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

0 голосов
/ 06 марта 2010

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

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

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

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

    duplicate class: X
    class X {
    

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

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

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

...