Nombre Maximum D'éléments enum en Java

Quel est le nombre maximum d'éléments permis dans un enum en Java?

je voulais savoir le nombre maximal de cas dans une instruction switch. Puisque le plus grand type primitif autorisé dans switch est int, nous avons des cas de -2.147.483.648 à 2.147.483.647 et un cas par défaut. Cependant les énumérations sont également autorisés... donc la question..

24
demandé sur Rnet 2010-12-17 09:56:58
la source

7 ответов

format de fichier de classe spec:

le pool constant par classe ou par interface est limité à 65535 entrées par le champ constant_pool_count de 16 bits de la structure ClassFile (§4.1). Il s'agit d'une limite interne à la complexité totale d'une classe ou d'une interface unique.

je crois que cela implique que vous ne pouvez pas avoir plus de 65535 nommé "choses" dans une seule classe, ce qui limiterait également le nombre d'enum constant.

si un voir un interrupteur avec 2 milliards de cas, je tuerai probablement tous ceux qui ont touché ce code.

heureusement, cela ne peut pas se produire:

la quantité de code par méthode non native et non abstraite est limitée à 65536 octets par les tailles des indices dans l'attribut exception_table du Code (§4.7.3), dans L'attribut LineNumberTable (§4.7.8), et dans l'attribut LocalVariableTable (§4.7.9).

26
répondu Thilo 2014-10-02 19:17:25
la source

le nombre maximum d'éléments enum est de 2746. La lecture de la spécification était très trompeuse et m'a amené à créer une conception défectueuse avec l'hypothèse que je n'atteindrais jamais la marque 64K ou même 32K de la haute eau. Malheureusement, le nombre est beaucoup plus faible que la spec semble l'indiquer. Comme test, J'ai essayé ce qui suit avec Java 7 et Java 8: J'ai lancé le code suivant en le redirigeant vers un fichier, puis j'ai compilé le résultat .fichier java.

    System.out.println("public enum EnumSizeTest {");
    int max = 2746;
    for ( int i=0; i<max; i++) {
        System.out.println("VAR"+i+",");
    }
    System.out.println("VAR"+max+"}");

résultat, 2746 fonctionne, et 2747 ne pas.

après 2746 entrées, le compilateur lance un code trop grand erreur, comme

EnumSizeTest.java:2: erreur: code trop grand

Decompiling ce fichier de classe Enum, la restriction semble être causée par le code généré pour chaque valeur enum dans le constructeur statique (la plupart du temps).

9
répondu Derek 2017-03-10 02:08:15
la source

Eh bien, sur jdk1.6 j'ai atteint cette limite. Quelqu'un a 10 000 enum dans un xsd et quand nous générons, nous obtenons un fichier enum de 60 000 lignes et j'obtiens une erreur de compilateur java de

[erreur] Échec de l'exécution goal org.Apache.maven.plugins: maven-compiler-plugin: 2.0.2: compiler (par défaut-compiler) on project framework: Compilation failure [Erreur] /Users/dhiller/Space/ifp-core/framework/target/generated-sources/com/framework/util/LanguageCodeSimpleType.java:[7627,4] code de trop grand

donc très probablement la limite est beaucoup plus basse que les autres réponses ici ou peut-être que les commentaires et autres qui sont générés prennent trop de place. Notez que le numéro de ligne est 7627 dans l'erreur du compilateur java mais si la limite de ligne est 7627, je me demande Quelle est la limite de longueur de ligne ;) qui peut être similaire. IE. les limites peuvent ne pas être basées sur le nombre d'enums mais les limites de longueur de ligne ou le nombre de lignes dans la limite de fichier donc vous auriez renommé enums à A, B, etc. être très petit pour intégrer plus d'énums dans l'enum.

7
répondu Dean Hiller 2012-05-12 22:55:31
la source

les Énums ont certainement des limites, avec la limite primaire (dure) autour de 32K valeurs. Ils sont soumis à des maximums de classe Java, à la fois du "pool constant" (64K entrées) et-dans certaines versions de compilateurs-à une limite de taille de méthode (64K bytecode) sur l'initialiseur statique.

initialisation'Enum' en interne, utilise deux constantes par valeur -- un FieldRef et une chaîne Utf8. Cela donne la "limite dure" à ~32K valeurs.

les compilateurs plus anciens (Eclipse Indigo au moins) fonctionnent aussi dans un problème quant à la méthode static initializer-size. Avec 24 octets de bytecode nécessaires pour instancier chaque valeur et l'ajouter au tableau des valeurs. une limite d'environ 2730 valeurs peut être rencontrée.

les nouveaux compilateurs (JDK 7 au moins) divisent automatiquement les grands initialisateurs statiques en méthodes nommées " enum constant initialization"," enum constant initialization" etc ... donc ne sont pas soumis à la deuxième limite.

vous pouvez démonter bytecode via javap -v -c YourEnum.class pour voir comment cela fonctionne.

[peut-être théoriquement possible d'écrire une classe" old-style " Enum comme Java codé à la main, pour dépasser la limite de 32K et se rapprocher des valeurs de 64K. L'approche serait d'initialiser les valeurs enum par réflexion pour éviter d'avoir des constantes de chaîne dans la piscine. J'ai testé cette approche et il fonctionne en Java 7, mais l'opportunité d'une telle approche (question de sécurité) sont discutables.]

Note aux éditeurs: Utf8 était un type interne dans L'IIRC classfile Java, ce n'est pas un typographie à corriger.

7
répondu Thomas W 2018-07-16 06:24:58
la source

la taille maximale de toute méthode en Java est de 65536 octets. Alors que vous pouvez théoriquement avoir un grand commutateur ou plus de valeurs enum, c'est la taille maximale d'une méthode que vous êtes susceptible de frapper en premier.

3
répondu Peter Lawrey 2010-12-17 11:00:11
la source

Enum la classe utilise un int pour suivre chaque valeur ordinale, de sorte que le max serait le même que int au mieux, si pas beaucoup plus faible.

Et comme d'autres l'ont dit, si vous devez demander vous le faites Mal

2
répondu Brad Mace 2010-12-17 10:09:31
la source

Il n'y a pas de nombre maximal soi pour toute fins pratiques. Si vous avez besoin de définir des milliers d'énumérations dans une classe, vous devez réécrire votre programme.

0
répondu fastcodejava 2010-12-28 04:19:15
la source

Autres questions sur