Quel est le nombre maximum de méthodes qu'une classe Java peut avoir?
Je pense à construire une très grande classe Java, y a-t-il une limite sur le nombre de méthodes que la classe Java peut avoir? Peut-il aller dans les millions de méthodes?
Mise à jour: Le but est, oui, de faire une classe "Dieu".
4 réponses
Selon la spécification de fichier de classe Java la limite est 65535:
4.10 Limitations de la machine virtuelle Java
Les limitations suivantes de la machine virtuelle Java sont implicites dans le format de fichier
class
:
- le nombre de méthodes pouvant être déclarées par une classe ou une interface est limité à 65535 par la taille de l'élément
methods_count
de la structureClassFile
(§4.1). Notez que la valeur de l'élémentmethods_count
duClassFile
la structure n'inclut pas les méthodes héritées de superclasses ou de superinterfaces.
Non. Quelques éléments pertinents de la spécification class file format :
Les limitations suivantes de la machine virtuelle Java sont implicites dans le format de fichier de classe:
Le pool de constantes par classe ou par interface est limité à 65535 entrées par le champ constant_pool_count 16 bits de la structure ClassFile (§4.1). Cela agit comme une limite interne sur la complexité totale d'une seule classe ou interface.
Le nombre de méthodes qui peuvent être déclarée par une classe ou une interface est limitée à 65535 par la taille de l'élément methods_count de la structure ClassFile (§4.1). Notez que la valeur de l'élément methods_count de la structure ClassFile n'inclut pas les méthodes héritées de superclasses ou de superinterfaces.
Je pense que cela signifie que vous pouvez avoir 65535 méthodes, mais seulement si vous n'avez pas d'autres objets qui occupent des emplacements dans le pool constant (noms de champs par exemple).
En plus de cela, il y a est aussi une taille maximale pour chaque méthode:
- la quantité de code par méthode non native et non abstraite est limitée à 65536 octets par les tailles des indices dans exception_table de L'attribut Code (§4.7.3), dans L'attribut LineNumberTable (§4.7.8) et dans L'attribut LocalVariableTable (§4.7.9).
Bien que methods_count dans la spécification VM soit U2 et donc 65535 le format d'une method_info a un name_index et un descriptor_index qui doivent tous deux pointer dans le pool constant qui a également un U2 constant_pool_count donc 32767 est le max, même cela n'est bien sûr pas possible car il ne permet pas d'autres entrées pour le nom de classe, les champs de super classe, etc.
Une classe ou une interface Java peut avoir au plus 65535 méthodes. Le code d'un constructeur en Java est limité à 65535 octets. Cela concerne également le nombre maximal de ports TCP/UDP possible sur une machine.