Quel est le nombre maximum de paramètres qu'une méthode en Java peut avoir et pourquoi?
J'utilise Java 1.8 sur un système Windows 64 bits.
Toutes les réponses sur StackOverflow à ce sujet indiquent que la limite technique est de 255 paramètres sans préciser pourquoi.
Pour être précis, 255 pour les this
méthodes statiques et 254 pour les méthodes non statiques (ce sera la 255e dans ce cas).
Je pensais que cela pouvait être décrit dans une sorte de spécification et qu'il y avait simplement un nombre maximum de paramètres autorisés statiquement défini.
Mais ce n'était valable que pour int
et tous les types 4 octets . J'ai fait quelques tests avec des long
paramètres, et je n'ai pu déclarer que 127 paramètres dans ce cas.
Avec les String
paramètres, le nombre autorisé que j'ai déduit des tests est de 255 (c'est peut-être parce que la taille de référence est de 4 octets en Java?).
Mais comme j'utilise un système 64 bits, la taille des références doit être de 8 octets de large et donc avec les String
paramètres, le nombre maximum autorisé doit être de 127, similaire aux long
types.
Comment cette limite est-elle exactement appliquée?
La limite a-t-elle quelque chose à voir avec la taille de pile de la méthode?
Remarque: Je ne vais pas vraiment utiliser ces nombreux paramètres dans aucune méthode, mais cette question est uniquement pour clarifier le comportement exact.
<= 4
. Quelque chose de plus devrait probablement être enveloppé dans un objet.Réponses:
Cette limite est définie dans la spécification JVM :
La section §4.3.3 donne quelques informations supplémentaires:
Vos observations étaient parfaites, les primitives de mot double (
long
/double
) ont besoin de deux fois la taille des variables habituelles de 4 octets et des références d'instance d'objet de 4 octets .En ce qui concerne la dernière partie de votre question relative aux systèmes 64 bits, la spécification définit le nombre d' unités qu'un paramètre contribue , cette partie de la spécification doit toujours être respectée même sur une plate-forme 64 bits, la JVM 64 bits accueillera 255 paramètres d'instance (comme votre 255
Strings
) quelle que soit la taille du pointeur de l'objet interne.la source
long
etdouble
indépendamment de l'architecture du système se produit dans de nombreux endroits de la spécification et semble être un vestige de l'ère 32 bits.La section 4.3.3 de la spécification JVM contient les informations que vous recherchez:
Par conséquent, il apparaît que le fait que la machine hôte soit 32 bits ou 64 bits n'a aucun effet sur le nombre de paramètres. Si vous remarquez, la documentation parle en termes d '"unités", où la longueur d'une "unité" est fonction de la taille du mot. Si le nombre de paramètres directement proportionnel à la taille du mot, il y aurait des problèmes de portabilité; vous ne pourriez pas compiler le même programme Java sur des architectures différentes (en supposant qu'au moins une méthode utilise le nombre maximum de paramètres sur l'architecture avec la plus grande taille de mot).
la source
J'ai trouvé un numéro intéressant dans une newsletter à ce sujet, http://www.javaspecialists.eu/archive/Issue059.html
la source