- De Penser en Java
Il ne peut y avoir qu'une seule classe publique par unité de compilation (fichier).
L'idée est que chaque unité de compilation a une seule interface publique représentée par cette classe publique . Il peut avoir autant de classes "amies" de soutien que vous le souhaitez. Si vous avez plus d'une classe publique dans une unité de compilation, le compilateur vous donnera un message d'erreur.
Desde el spécification (7.2.6)
Lorsque les paquets sont stockés dans un système de fichiers (?7.2.1), le système hôte peut choisir pour appliquer la restriction selon laquelle il s'agit d'une erreur de compilation si un type n'est pas trouvé dans un fichier sous un nom composé du nom du type et d'une extension (telle que .java ou .jav) si l'une des conditions suivantes est remplie :
- Le type est référencé par le 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 depuis le code d'autres paquets).
- Cette restriction implique qu'il doit y avoir au maximum un tel type par unité de compilation.
- Ce site permet à un compilateur du langage de programmation Java ou à une implémentation de la machine virtuelle Java de trouver facilement une classe nommée dans un paquetage. ; par exemple, le code source d'un type public wet.sprocket.Toad se trouverait dans un fichier Toad.java dans le répertoire wet/sprocket, et le code objet correspondant se trouverait dans le fichier Toad.class dans le même répertoire.
En bref, il s'agit peut-être de trouver des classes sans devoir tout charger dans le classpath.
Edit : "peut choisir" semble laisser la possibilité de no suivre cette restriction, et le sens de "peut" est probablement celui décrit dans RFC 2119 (c'est-à-dire "facultatif")
En pratique, cependant, cette règle est appliquée dans tant de plates-formes et utilisée par tant d'outils et d'IDE que je ne vois aucun "système hôte" choisir de no appliquer cette restriction.
De " Il était une fois un chêne ... "
C'est assez évident, comme la plupart des choses, une fois que l'on connaît les raisons de leur conception. le compilateur devrait effectuer un passage supplémentaire par toutes les unités de compilation (fichiers .java) pour déterminer quelles classes se trouvent à quel endroit, ce qui rendrait la compilation encore plus lente.
(Note :
el Spécification du langage Oak pour Oak version 0.2 (document postcript) : Chêne était le nom original de ce qui est maintenant communément appelé Java, et ce manuel est le plus ancien manuel disponible pour Oak (c'est-à-dire Java).
Pour en savoir plus sur les origines de Java, veuillez consulter le site suivant le projet vert y Technologie Java(TM) : Une histoire ancienne
)
7 votes
À mon avis, la pire décision de conception dans l'histoire de l'informatique a été que Java force le mappage fichier/classe.
10 votes
@Neil - C'est un peu dur. Avez-vous utilisé Lotus Notes ?
1 votes
@oxbow_lakes : Tu m'as rendu curieux. Qu'est-ce que ça a à voir avec Lotus Notes ?
0 votes
Dupe : stackoverflow.com/questions/968347/
0 votes
@oxbow En fait, oui. Je l'ai également programmé ainsi que ccMail, et même si aucun de ces deux outils ne sera jamais mon préféré, j'ai trouvé qu'ils avaient une API étonnamment bien conçue, si je me souviens bien (c'était il y a longtemps).
5 votes
@Andre - Eh bien, quand j'entends la phrase "Pire décision de conception dans l'histoire de l'informatique" Lotus Notes me vient à l'esprit.
0 votes
@sandbox Je suis d'accord pour dire que ce n'est pas une copie, et je pense que c'est une question intéressante, bien qu'on ne puisse pas vraiment y répondre, sauf par M. Gosling. Elle devrait donc probablement être CW.
8 votes
Même en C#, il est généralement considéré comme une mauvaise idée d'avoir plus d'un type de premier niveau dans un fichier, sauf s'il s'agit de délégués.
0 votes
@jon qu'en est-il des classes dérivées de EventArgs ? Si une seule classe particulière l'utilise pour envoyer des arguments, pourquoi ne pas l'avoir dans le même fichier ?
5 votes
@Jon Skeet Je ne peux pas parler pour C#, mais en C++ il n'y a pas d'opinion de ce genre. Plusieurs classes connexes dans le même fichier ont beaucoup de sens.
0 votes
@Neil : Je ne pourrais pas être plus en désaccord, et mon point de vue est la raison pour laquelle mon code C++ se construit plus rapidement que d'autres. Pas. Même pas. Presque.
0 votes
@280Z28 Donc #inclure plus de fichiers accélère votre processus de construction ? Intéressant.
1 votes
@Neil : Non, inclure moins de fichiers accélère le processus de construction. L'idée est de ne jamais introduire une chaîne de dépendance sémantique qui ne soit pas nécessaire à la compilation de l'élément de code. X . J'ai constaté que cela peut être accompli avec un impact maximal à une granularité par classe. Cela vous permet également de maintenir la taille de la PCH de GCC en dessous de 70mb sur les grands projets. Au-delà, vous subissez une baisse de performance assez remarquable par rapport à son "sweet spot" (bien que ce soit loin d'être le seul endroit où cela a un impact).
0 votes
@280Z28 Je ne vois pas en quoi votre deuxième commentaire conforte le premier. Mais les commentaires de l'OS ne sont pas la forme idéale pour des discussions comme celles-ci - peut-être pourriez-vous développer vos idées dans une question de wiki communautaire ?
0 votes
@Neil : C'est tout le contraire, cela impose un schéma de nommage et de mappage des répertoires et des fichiers. Je frémis à l'idée des moyens horribles que les programmeurs de pacotille pourraient inventer pour bousiller cette partie de la gestion de projet s'ils étaient autorisés à se déchaîner avec leurs propres schémas de nommage.
0 votes
@Neil : C'était dirigé vers votre commentaire initial, en fait.
3 votes
@Neil, au début je trouvais cela ennuyeux, mais après avoir beaucoup utilisé Java, j'ai trouvé que cette convention aide beaucoup quand on travaille avec le code d'autres personnes ! Vous avez beaucoup moins de Gjessing à dó ce qui est vraiment bien !