Почему исходный файл Java содержит имя открытого класса, который он содержит?

14

Я новичок в изучении Java. В Java каждый исходный файл должен содержать открытый класс, и этот исходный файл должен иметь то же имя, что и этот открытый класс. Более того, ни один исходный файл не может содержать два открытых класса. Почему это ограничение?

пользователь
источник
4
Без специфики это исторический проектный метод разработки Java. Недавно разработанные языки, такие как C #, хотя и похожи на Java, не имеют этого ограничения.
gahooa
13
Разве это не для обеспечения соблюдения передового опыта? Я думал, что это единственная причина. В C # у вас нет этого ограничения на техническом уровне, но StyleCop все равно будет жаловаться, если имя файла и имя класса не совпадают или если у вас есть несколько классов в одном файле. Visual Studio также сильно поощряет отношения между классами и файлами (представьте диаграммы классов, которые создают файлы для вас, или когда вы переименовываете файл .cs, Visual Studio спросит вас, хотите ли вы также изменить рефакторинг имени класса).
Арсений Мурзенко
В скомпилированном языке старого стиля компоновщик находит все ссылки и внешние символы. Но Java не связана - вы можете загружать файлы jar во время выполнения, если хотите. Без шага ссылки попытка сопоставить имена классов с местоположениями в пути к классам намного быстрее, если вы знаете, какое имя файла искать.
Пол Томблин
4
@gahooa это не дизайнерский артефакт, это продуманное дизайнерское решение. Это делает многое намного проще.
1
Как насчет использования grep ?
пользователь

Ответы:

19

В одном из своих новостных бюллетеней для Java-специалистов Хайнц Кабуц копает спецификации языка дуба . Он пишет:

Почему каждый публичный класс находится в отдельном файле? (Секция 1)

Это вопрос, который мне часто задавали во время моих курсов. До сих пор у меня не было хорошего ответа на этот вопрос. В разделе 1 мы читаем: «Хотя каждая единица компиляции Oak может содержать несколько классов или интерфейсов, самое большее один класс или интерфейс на единицу компиляции может быть общедоступным».

На боковой панели объясняется, почему: «Это ограничение еще не применяется компилятором, хотя оно необходимо для эффективного импорта пакетов»

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

http://www.javaspecialists.eu/archive/Issue055.html

Landei
источник
1
Сделать компиляцию чуть быстрее? В самом деле? Не потому что это делает ваш код намного более организованным? Я очень сомневаюсь, что это правильный ответ.
BlueRaja - Дэнни Пфлюгофт
1
@ BlueRaja-DannyPflughoeft В 1998 году я уверен, что это имело гораздо большее значение
TheLQ
8

Причины, о которых я могу думать

  • Вначале немного упрощает поиск других классов для компилятора, поскольку ему не нужно искать все потенциально тысячи файлов классов для произвольного открытого класса, он может просто перейти к файлу.
    • Это, вероятно, больше не имеет значения, но только начал раннее соглашение, которое никогда не менялось
  • При компиляции изменение файла влияет только на этот файл. Если есть несколько классов, то все должно быть перекомпилировано
  • Наилучшая практика. Наличие нескольких открытых классов в одном файле приводит к путанице. Назначение файлов - организовать исходный код, назначение папок - организовать файлы. Если все классы определенного пакета находятся в одном суперфайле размером 100 МБ, то вы потеряли все преимущества и не получили ни одного из преимуществ файлов (плюс добавили много головной боли при редактировании)
TheLQ
источник
1
Классы и интерфейсы не обязательно представляют наиболее естественный уровень подразделений для исходного кода. Наличие нескольких тысяч строк кода, записанных в одном файле, неудобно, но не имеет и того, чтобы 100 строк «реального» контента (исключая комментарии или дублированные директивы компилятора) распространялись среди дюжины исходных файлов. Интересно, как это будет работать, если файл с именем для типа должен либо содержать определение, либо идентифицировать файл, который это делает?
суперкат