2009-12-24 7 views
9

Lorsque je veux créer une classe Java, elle génère automatiquement un fichier avec le même nom de classe.Pourquoi ne puis-je donner un nom différent à la classe que le nom du fichier?

Mais quand il génère une classe, il peut changer le nom du fichier différent du nom de la classe .. Ai-je raté quelque chose?

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: Je sais ce que c'est. Je ressens toujours la même chose et j'obtiens toujours les mêmes réponses. –

+2

+1 pour les graphiques impressionnants dans la question. Comment avez-vous créé cela? –

+0

J'ai utilisé jing pour capturer et dessiner ces lignes rouges :) – uzay95

Répondre

4

La spécification de langage elle-même ne dicte pas cela (je viens de jeter un oeil, et je ne trouve aucune référence à cela), mais elle est généralement appliquée par les outils. Cela facilite considérablement la gestion des dépendances des outils, puisqu'elle sait où chercher la classe B si la classe A y fait référence. La convention s'étend à la structure du répertoire faisant écho à la structure du paquet, mais encore une fois, ce n'est qu'une convention.

+0

+1 - C'est certainement une convention, pas une restriction de langue. –

+3

C'est encore une convention imposée par presque tous les compilateurs et outils. Ce qui en fait effectivement une restriction de langage, même si elle n'est pas dictée par la JLS. – Joey

+2

Voir la réponse de Pascal Thivent ci-dessous; il y a ** une référence à ceci dans la JLS. – delfuego

9

Parce que les concepteurs de langage dire. C'est aussi simple que ça. C'est une convention et ils vous forcent à le suivre.

+3

Cela simplifie le chargement des classes. –

+0

Lorsque Java crée lui-même une classe (comme dans la figure 2), il le nomme différemment. Je veux dire le nom de la classe et le nom du fichier qui contient cette classe sont différents. Regardez de près la figure 2. Vous verrez sur la droite que le nom du fichier est 'Book_1.java' alors que le nom de la classe est 'Book'. Voyez-vous mon point? – uzay95

+0

@ uzay95, Java ne crée pas la classe. Votre outil/IDE le fait. Je ne sais pas ce qu'est l'outil, mais ça ressemble à un bug. Cela ou vous essayez de créer des classes Book dans le même paquet. – Glen

1

Si je peux changer le monde, je souhaite que les concepteurs de C# le fassent aussi. Combien de temps peut être économisé en forçant les gars à ne pas créer de fichier classes.cs et à y mettre tout le code. N'est-ce pas comme l'exigence d'accolades pour If. Pourquoi la force de la langue me faire cette chose idiote:

if (true) 
{ 

} 

au lieu de

if true 
{ 

} 

:-)

+0

Mais parfois, ces règles rendent plus lisible. – uzay95

+0

Plus lisible? pour qui? Quand j'ouvre un projet, je devrais pouvoir _very_ trouver facilement le fichier par nom de classe et trouver la classe par nom de fichier, et si les outils forcent les gens à suivre ces règles, je vote pour cela. –

7

Citant la section 7.6 Top Level Type Declarations du Java Language Specification:

Lorsque les paquets sont stockés dans un fichier système (§7.2.1), le système hôte peut choisir d'appliquer la restriction qu'il est une erreur de compilation si un type ne se trouve pas dans un fichier sous un nom composé du nom de type, plus une extension (comme .java ou .jav) si l'une des ce qui suit est vrai:

  • le type est désigné par un code dans d'autres unités de compilation du paquet dans lequel le type est déclaré.
  • Le type est déclaré public (et est donc potentiellement accessible à partir du code d'autres packages).

Cette restriction implique qu'il y doit y avoir au plus un tel type par unité de compilation.Cette restriction le rend facile pour un compilateur pour le langage de programmation Java ou une implémentation de l'ordinateur Java Java pour trouver une classe nommée dans un package ; par exemple, le code source pour un type publique wet.sprocket.Toad serait trouvée dans un fichier Toad.java dans le répertoire wet/sprocket et le code objet correspondant serait dans le fichier Toad.class dans le même répertoire.

Lorsque les packages sont stockés dans une base de données (§7.2.2), le système hôte doit ne pas imposer de telles restrictions. Dans pratique, de nombreux programmeurs choisissent mettre chaque classe ou type d'interface dans sa propre unité de compilation, si ou il est public ou est référencé par dans d'autres unités de compilation.

+0

Merci d'être la seule personne dans ce fil qui a trouvé la partie pertinente de la spécification de la langue et l'a cité, plutôt que de parler de votre postérieur. :) – delfuego

+0

Quoi qu'il en soit, le JLS dit "peut choisir d'appliquer *, donc c'est toujours une convention, plutôt qu'une règle dure. – skaffman

Questions connexes