Вопрос-ответ

Why are filenames in Java the same as the public class name? [closed]

Почему имена файлов в Java совпадают с именем общедоступного класса?

В Java имя файла должно совпадать с именем public class содержащегося в этом файле. Почему это ограничение? Какой цели оно служит?

Переведено автоматически
Ответ 1

В Java был интересный подход: когда предоставление программисту выбора может только ухудшить опыт программирования, удалите выбор.

Они делали это довольно часто. Имена файлов и пакетов - это точно, но также не позволяет использовать несколько общедоступных классов в файле (никогда не годится), не позволяет разделять классы между файлами (чертовски сложно работать!) и т.д.

Языки принимают множество подобных решений, все они влияют на удобство использования и ремонтопригодность. Некоторые другие, которые могли бы быть хорошим выбором:

Общедоступные переменные: мне они никогда не были нужны, и я никогда не видел ситуации, когда какой-нибудь умный программист думал, что они необходимы, и на самом деле был прав.

Ограничения по размеру метода / класса были бы великолепны, но это может оказаться схематичным (это может быть легко реализовано средствами проверки кода, проблема обычно в том, что компании, которым больше всего нужна помощь, не знают, что им нужна помощь, и, следовательно, не используют такие инструменты, как средства проверки кода).

Смысл ответа в том, что, хотя для большинства небольших команд это не имеет значения, когда ваша команда растет и имеет несколько сайтов с разделенными командами и консультантами по всему миру, вы действительно должны ценить негибкость.


В ответ на комментарий setters / getters:

Java beans были мерзостью, созданной Borland для взлома их графического интерфейса, а затем модифицированной в Java.

Ужасная идея - отвлекает от OO-программирования - геттеры и сеттеры: А) показывают слишком большую часть вашей реализации и Б) заставляют вас думать в терминах оперирования данными из другого объекта, а не просить другой объект выполнить операцию за вас. Плохой хак для людей, которые еще не умеют думать в OO.

Геттеры иногда необходимы, но их не следует добавлять, если только это не является абсолютно неизбежным.

Установщиков следует избегать любой ценой. Если вам абсолютно необходимо внешне изменить состояние после создания объекта, попробуйте использовать шаблон builder и защитите свои установщики от вызова после выполнения любой операции.

Очевидно, что для всего есть исключения, и многие "Получатели" на самом деле являются критически важными объектами бизнес-логики, такими как String .функция length(), которая требовалась бы независимо от того, как была реализована строка, и даже не реализуется простым возвратом свойства - отличный пример для "Геттера", если вы вообще хотите это так назвать.

Ответ 2

Я собирался сказать, что это просто обязательно. Но я посмотрел на JLS, и он не такой строгий. С точки зрения JLS, компилятору остается выбирать, устанавливать такое ограничение или нет.

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

Ответ 3

Чтобы быть более конкретным, у имени файла должно быть то же имя, что и у имени открытого класса в этом файле, что является способом сообщить JVM, что для вас это точка входа.

Ответ 4

Это просто соглашение, установленное Sun, создателями Java.
Цель - организация; причина в том, чтобы у каждого, кто программирует на Java, был единый способ именования файлов.

java