Зачем вам когда-либо нужен файл Java без публичных классов, объявленных в нем?


Answers

Вы можете создать файл с именем package-info.java , который содержит только оператор package . Инструмент javadoc 1.5+ рассматривает комментарий javadoc для этого оператора пакета точно так же, как файл package.html . Кроме того, вы можете добавлять аннотации на уровне пакетов, такие как @Generated для этого оператора, которые вы не можете сделать в package.html .

Поскольку package-info не является допустимым идентификатором Java, нет никакого риска, что этот файл столкнулся бы с существующим Java-классом (т.е. обратной совместимостью).

Question

В книге, которую я читаю для квалификации SCJP, есть заявление, в ней говорится:

Файлы без открытых классов не имеют ограничений на именование

Это заставило меня спросить: зачем вам это делать?

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




Хотя я очень поздно отвечаю на вопрос, но это, безусловно, поможет. Если я не ошибаюсь, ваш конкретный вопрос сводится к следующему: в чем смысл объявленного класса без явного модификатора ?

Взгляните на этот класс, присутствующий в java.util package-

class JumboEnumSet<E extends Enum<E>> extends EnumSet<E>

Также смотрите в том же пакете,

class RegularEnumSet<E extends Enum<E>> extends EnumSet<E>

Вы видите, что оба они объявлены без явного модификатора . Вы задавались вопросом, почему частное ограничение пакета ? Вот причина из удивительной книги « Эффективная Java 2nd Edition» Джошуа Блоха # Item1

Класс java.util.EnumSet (элемент 32) , представленный в версии 1.5, не имеет общих конструкторов, а только статических фабрик. Они возвращают одну из двух реализаций, в зависимости от размера базового типа перечисления: если у него есть шестьдесят четыре или меньше элементов, как это делают большинство типов перечислений, статические фабрики возвращают экземпляр RegularEnumSet, который поддерживается одним длинным; если тип перечисления имеет шестьдесят пять или более элементов, фабрики возвращают экземпляр JumboEnumSet, поддерживаемый длинным массивом.

Двигайтесь быстро, он добавляет:

Существование этих двух классов реализации невидимо для клиентов. Если RegularEnumSet перестало предлагать преимущества производительности для небольших типов перечислений, его можно было бы исключить из будущего выпуска без каких-либо негативных последствий. Аналогичным образом, будущий выпуск может добавить третью или четвертую реализацию EnumSet, если она окажется полезной для производительности. Клиенты не знают и не заботятся о классе объекта, который они возвращают с завода; они заботятся только о том, что это какой-то подкласс EnumSet.