2009-12-24 2 views
9

Когда я хочу создать класс java, он автоматически генерирует файл с тем же именем класса.Почему я не могу дать другое имя классу, чем имя файла?

Но когда он сгенерирует класс, он может изменить имя файла, отличное от имени класса. У меня что-то отсутствует?

alt text http://content.screencast.com/users/uzay95/folders/Jing/media/9533b1df-6194-4660-aada-2f7c4e0df6c0/2009-12-24_1603.png

alt text

+0

@ uzay95: Я знаю, как это. Я чувствую то же самое все время и получаю одинаковые ответы всегда. –

+2

+1 для удивительной графики в вопросе. Как вы это создали? –

+0

Я использовал jing для захвата и рисования этих красных линий :) – uzay95

ответ

4

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

+0

+1 - Это определенно конвенция, а не ограничение языка. –

+3

Это все еще конвенция, применяемая почти всеми компиляторами и инструментами. Что фактически делает это языковым ограничением, даже если оно не продиктовано JLS. – Joey

+2

См. Ниже ответ Паскаля Тивента; ** ** ссылка на это в JLS. – delfuego

9

Поскольку разработчики языка говорят так. Это действительно настолько просто. Это соглашение, и они заставляют вас следовать за ним.

+3

Это упрощает загрузку классов. –

+0

Когда сама Java создает класс (как на рисунке 2), он называет его по-разному. Я имею в виду, что имя класса и имя файла, которое содержит этот класс, различны. Посмотрите внимательно на рисунок 2. С правой стороны вы увидите, что имя файла «Book_1.java», а имя класса - «Книга». Вы видите мою мысль? – uzay95

+0

@ uzay95, Java не создает класс. Ваш инструмент/IDE делает. Я не знаю, что такое инструмент, но он выглядит как ошибка. Это или вы пытаетесь создать слишком классы книг в одном пакете. – Glen

1

Если я могу изменить мир, я хочу, чтобы дизайнеры C# тоже это делали. Сколько времени можно спасти от принуждения парней не создавать файлы classes.cs и помещать в него ВСЕ-код. Разве это не так, как требование брекетов для If. Почему язык заставить меня сделать эту глупую вещь:

if (true) 
{ 

} 

вместо

if true 
{ 

} 

:-)

+0

Но иногда эти правила становятся более читабельными. – uzay95

+0

Более читабельны? для кого? Когда я открываю проект, я должен иметь возможность легко найти файл по имени класса и найти класс по имени файла, а если инструменты заставят людей следовать этим правилам, я голосую за него. –

7

Цитируя раздел 7.6 Top Level Type Declarations из Java Language Specification:

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

  • тип называется кодом в других модулях компиляции пакета , в котором объявлен тип.
  • Тип объявлен public (и поэтому потенциально доступен из кода в других пакетах).

Это ограничение означает, что должно быть не более одного такого типа на единицы компиляции.Это ограничение упрощает составление компилятора для языка программирования Java или виртуальной машины Java , чтобы найти именованный класс в пакете ; например, исходный код для публичного типа wet.sprocket.Toad будет найден в файле Toad.java в каталоге wet/sprocket и соответствующий код объекта будет найден в файле Toad.class в же каталоге.

Когда пакеты хранятся в базе данных (§7.2.2), хост-система должна не устанавливать такие ограничения. В практике многие программисты выбирают . Поместите каждый класс или тип интерфейса в свой собственный блок компиляции, будь то или , не является общедоступным или называется код в других единицах компиляции.

+0

Благодарим вас за то, что вы единственный человек в этой теме, который нашел соответствующую часть спецификации языка и процитировал ее, вместо того, чтобы говорить из вашего заднего. :) – delfuego

+0

Независимо от того, JLS говорит, что «может выбрать принуждение», так что это все еще соглашение, а не жесткое правило. – skaffman

Смежные вопросы