Чому вихідний файл Java має ім'я публічного класу, який він містить?


14

Я новачок, що навчається Java. У Java кожен вихідний файл повинен містити загальнодоступний клас, і цей вихідний файл повинен мати те саме ім'я, що і цей публічний клас. Більше того, жоден вихідний файл не може містити два загальнодоступні класи. Чому це обмеження?


4
Без конкретики, це історичний артефакт дизайну способу побудови Java. Більш недавно розроблені мови, як-от C #, хоча і схожі на Java, не мають цього обмеження.
gahooa

13
Хіба це не застосовувати передовий досвід? Я думав, що це єдина причина. У C # у вас немає такого обмеження на технічному рівні, але все-таки StyleCop скаржиться, якщо ім'я файлу та назва класу не збігаються або якщо у вас є кілька класів в одному файлі. Visual Studio також сильно заохочує співвідношення класів-файлів (діаграми класових роздумів, які створюють файли для вас, або коли ви перейменовуєте файл .cs, Visual Studio запитує вас, чи не хочете ви також перейменовувати ім’я класу).
Арсеній Муренко

У мові, складеній у старому стилі, лінкер знаходить усі посилання та зовнішні символи. Але Java не пов'язана - ви можете завантажувати банки під час виконання, якщо хочете. Без кроку посилання, спроба зіставити назви класів на місця в класі class набагато швидше, якщо ви знаєте, яке ім'я файлу шукати.
Пол Томблін

4
@gahooa це не артефакт дизайну, це навмисне дизайнерське рішення. Це набагато полегшує багато речей.

1
Що з використанням grep ?
користувач

Відповіді:


19

В одному зі своїх бюлетенів спеціалістів Java, Хайнц Кабуц розглядає специфікації мови дуба . Він пише:

Чому кожен публічний клас є в окремому файлі? (Розділ 1)

Це питання, яке мені часто задавали під час моїх курсів. До цього часу я не мав належної відповіді на це питання. У розділі 1 ми читаємо: "Хоча кожен блок компіляції Дуба може містити кілька класів або інтерфейсів, щонайменше один клас або інтерфейс на один блок компіляції може бути відкритим".

На бічній панелі пояснюється, чому: "Цей обмеження ще не застосовується компілятором, хоча воно необхідне для ефективного імпорту пакета"

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

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


1
Щоб зробити компіляцію незначно швидше? Дійсно? Не тому, що це робить ваш код набагато більш організованим? Я дуже сумніваюся, що це правильна відповідь.
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft У 1998 році я впевнений, що це
змінило

8

Причини, які я можу придумати

  • Полегшує пошук інших класів трохи простіше для компілятора, оскільки йому не потрібно шукати всі потенційно тисячі файлів класів для випадкового публічного класу, він може просто перейти до файлу.
    • Це, мабуть, вже не має значення, але тільки розпочато рання конвенція, яка ніколи не змінювалася
  • При компіляції зміна файлу впливає лише на цей файл. Якщо є кілька класів, то все потрібно перекомпілювати
  • Найкраща практика - наявність кількох публічних занять в одному файлі робить заплутані речі. Мета файлів - організація вихідного коду, мета папок - організація файлів. Якщо всі класи певного пакету знаходяться в одному супер-файлі розміром 100 Мб, ви втратили всі переваги і не отримали жодної переваги файлів (плюс додавши багато головного болю при редагуванні)

1
Класи та інтерфейси не обов'язково представляють найбільш природний рівень підрозділів вихідного коду. Маючи багато тисяч рядків коду, зафіксованих в одному файлі, незручно, але не існує, а також розміщення 100 рядків "реального" вмісту (за винятком коментарів чи дублюваних директив компілятора) поширюється серед десятків вихідних файлів. Цікаво, як це буде працювати, якби файл, названий для типу, повинен був або містити визначення, або ідентифікувати інший файл?
supercat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.