Pourquoi seulement 1 classe publique dans le fichier Java

Dans n’importe quel fichier Java, pourquoi ne pouvons-nous avoir qu’une seule classe publique dont le nom est identique au nom du fichier Java?

Il oblige tout le code Java à être organisé d’une certaine manière , ce qui à long terme améliore la lisibilité du code .

Les concepteurs Java ont choisi une approche ssortingcte qui renforce leur idée de bonnes pratiques de conception, et cela fait partie de ce thème. Contrastez cela avec l’attitude de rien dans Perl.

Selon cette source , c’est pour une compilation efficace:

Dans la barre latérale, il explique pourquoi: “Cette ressortingction n’est pas encore appliquée par le compilateur, même si elle est nécessaire pour une importation efficace des paquets”

C’est assez évident – comme la plupart des choses une fois que vous connaissez les raisons de conception – le compilateur devrait faire un passage supplémentaire à travers toutes les unités de compilation (fichiers .java) pour déterminer quelles classes étaient et cela rendrait la compilation encore plus lente .

Il en va de même pour les importations de fichiers sources dans les IDE. Une autre raison serait la taille raisonnable des sources.

Ce sont les règles. Bien que ce ne soit pas tout à fait vrai. Vous pouvez définir des classes internes dans votre classe “principale” comme ceci:

 public class A { public class B { ... } } 

Avec l’aimable autorisation du Dr Heinz Kabutz et son excellente newsletter ….

Pourquoi chaque classe publique est-elle dans un fichier séparé?

C’est une question qui m’a souvent été posée pendant mes cours. Jusqu’à présent, je n’ai pas eu de bonne réponse à cette question. Dans la section 1, nous lisons: “Bien que chaque unité de compilation Oak puisse contenir plusieurs classes ou interfaces, au plus une classe ou une interface par unité de compilation peut être publique”.

Dans la barre latérale, il explique pourquoi: “Cette ressortingction n’est pas encore appliquée par le compilateur, même si elle est nécessaire pour une importation efficace des paquets”

C’est assez évident – comme la plupart des choses une fois que vous connaissez les raisons de conception – le compilateur devrait faire un passage supplémentaire à travers toutes les unités de compilation (fichiers .java) pour déterminer quelles classes étaient et cela rendrait la compilation encore plus lente .

Nous ne pouvons avoir qu’une seule classe publique ou une interface publique dans une unité de compilation Java (fichier source .java).

Mais il peut y avoir un nombre quelconque de classes / interfaces par défaut par fichier src.

Pourquoi:

JLS laisse l’option au compilateur java. Et la plupart des implémentations du compilateur obligent à avoir le même nom de fichier que:

(1) le nom de la classe publique / interface

(2) s’il y a une méthode principale et aucune classe publique alors n’importe quel nom

(3) S’il existe une méthode principale et une classe publique, la méthode principale doit être dans cette classe publique

(4) s’il n’y a pas de classe publique et pas de méthode principale, alors tout nom valide correspondant ou non aux noms de classe / interface du fichier.

De (2): Si deux classes publiques sont autorisées, nous devrions atsortingbuer au fichier deux noms, ce qui ne veut absolument rien dire pour le système de fichiers. De (3): Si deux classes publiques sont autorisées, nous devrions avoir deux méthodes principales qui ne veulent absolument rien dire.

Par conséquent, un fichier source Java peut avoir une seule classe publique.

Je pense que les 4 points ci-dessus sont forcés par le compilateur à faire le travail du compilateur et de jvm pour trouver un fichier source ou un fichier de classe java particulièrement simple pour la compilation / chargement / liaison. Java a des ressortingctions intégrées que les développeurs doivent suivre pour avoir une meilleure programmation.

Source: Mes lectures et compréhension.

Pour comprendre la raison fondamentale de ces ressortingctions, supposons que le compilateur ne génère pas d’erreur de compilation pour ne pas nommer le nom de fichier de la même manière que le nom de la classe publique.

Supposons qu’il y ait un paquet A

  A / \ file1.java file2.java 

fichier1.java

 package A; class file1 { public static void main(Ssortingng args[]) { } } public class file3 { public static void main(Ssortingng args[]) { } } 

Maintenant que nous soaps qu’un cours public peut également être accessible en dehors du package, il incombera désormais au développeur de le rendre accessible au monde extérieur. Voyons comment:

Supposons que le paquet A ne contienne que des fichiers Java (pas de fichiers de classe) et une classe en dehors du paquet A tente d’accéder au fichier de classe public3, le compilateur essaiera d’abord de trouver le fichier 3.class (non disponible). ( indisponible ). Donc, même si class3 class est de nature publique, il n’est pas visible pour le monde extérieur. Donc, si un compilateur met la ressortingction que si un fichier contient une classe publique, il doit être nommé comme le nom de la classe publique, alors le problème ci-dessus peut être résolu et le développeur n’aura pas à penser à exposer la classe publique au monde extérieur .

Le compilateur impose également la ressortingction qu’il devrait y avoir au plus une classe publique par fichier Java, de sorte que chaque classe publique puisse être accessible par le monde extérieur.

Java utilise cette convention pour trouver le bytecode de classe / interface en commençant par le chemin de classe et en recherchant la hiérarchie de package dans les sous-répertoires. La représentation du système de fichiers de cette hiérarchie impose également certaines règles de base.

  1. Deux classes ou interfaces Java dans le même package ne peuvent pas avoir le même nom. Les noms de fichiers seraient en conflit.
  2. Deux packages Java du même package parent ne pouvaient pas porter le même nom. Les chemins de dossier seraient en conflit.
  3. Une classe a une visibilité sur toutes les classes du même package sans modification du classpath.

Pour avoir une compréhension entre le compilateur et le programmeur. C’est une règle que le code source doit avoir au moins une classe publique et que cette classe doit contenir la fonction principale. Ainsi, sans confusion / ressortingction, le compilateur peut accéder (public) à la classe et nommez le nom de la classe dans le fichier de classe. Comme cette classe contient le main (), l’exécution du fichier de classe donnera un stream correct

Il permet une recherche plus efficace des fichiers source ( .java) et compilés ( .class) lors de la compilation (directive import) et un chargement de classe plus efficace lors de l’exécution. L’idée étant: si vous connaissez le nom d’une classe, vous savez où elle doit être trouvée pour chaque entrée de classpath. Aucune indexation requirejse.

Je pense que cela peut être une raison possible. Il ne peut y avoir qu’une seule classe publique dans un fichier java car le nom du fichier java est identique au nom de la classe publique. Et de toute évidence, nous ne pouvons pas avoir un fichier avec deux noms différents.