Nombre maximal de paramètres en Java déclaration de méthode
Quel est le nombre maximum de paramètres à une méthode en Java peut avoir et pourquoi?
Je suis à l'aide de Java 1.8 sur un système Windows 64 bits.
Toutes les réponses sur StackOverflow à propos de ce dire que la limite technique est de 255 paramètres sans préciser pourquoi.
Pour être précis, 255 statique et 254 pour les non-statique (this
sera le 255e dans ce cas) méthodes.
J'ai pensé que cela pourrait être décrit dans une sorte de spécification et qu'il est tout simplement un définis de manière statique nombre maximal de paramètres autorisés.
Mais ce n'était valable que pour int
et tous les 4 octets de types.
J'ai fait quelques tests avec long
paramètres, et je n'ai pu déclarer 127 paramètres dans ce cas.
Avec String
paramètres, le nombre autorisé j'en ai déduit du test est de 255 (il est peut-être parce que la taille de référence est de 4 octets en Java?).
Mais depuis que je suis à l'aide d'un système 64 bits, les références de la taille doit être de 8 octets et donc, avec String
paramètres le nombre maximal autorisé doit être 127, semblable à long
types.
Comment cette limite est exactement appliqué?
La limite ont rien à voir avec la taille de la pile de la méthode?
Note: je ne suis pas vraiment à l'utilisation de ces nombreux paramètres à une méthode, mais cette question est seulement de clarifier le comportement exact.
- 7, si vous ne voulez pas devenir fou avec la lisibilité. (Je sais ce que vous êtes en train de demander).
- Je dirais
<= 4
. Rien de plus devrait probablement être enveloppé dans un objet. - j'ai été en mesure de déclarer que uniquement Ce qui erreur de compilation avez-vous lorsque vous avez essayé avec plus?
- Pourquoi est-ce une question intéressante? Si vous écrivez un programme et que vous avez atteint cette limite, votre conception est erronée. Je ne comprends pas pourquoi une telle pratiquement inutile question devient donc beaucoup de upvotes.
- parce que ce questions de questions de connaissances de la spécification de la JVM. Cette question n'est pas de se demander "Comment faire ceci ou cela ?" au lieu de cela il des questions "Pourquoi j'ai besoin de ça ?"... +1 question Intéressante Userv
- erreur : trop de paramètres
- exactement ce que je pensais. L'OP n'était tout simplement des curieux.
- Je suppose que pourrait être utile à savoir pour la génération automatique de code compilable.
- "J'ai essayé cela avec les paramètres longs, et j'ai été en mesure de déclarer que uniquement de 128 paramètres dans ce cas." - selon la spécification, chaque long est de 2 unités, et 2 * 128 = 256 qui dépasse la limite de 255. Êtes-vous sûr que vous avez réussi à déclarer 128 paramètres longs?
- il est de 127. J'ai édité. Merci
- Je suis tombé sur ce post quand j'ai reçu un SAVON fichier WSDL qui a un objet défini avec plus de 256 membres et d'un avertissement de la Java constructeur généré à partir il échoue parce qu'il aurait plus que le nombre autorisé un des paramètres.
- Notez que vous pouvez utiliser efficacement que de nombreux paramètres comme vous le souhaitez. Des Collections sont des objets et appelée par la référence. Vous pouvez utiliser une Map<String, Object> ou une Liste<Object> pour émuler des paramètres mais en passant des milliers d'entre eux dans un seul argument.
- Pour un exemple concret: je veux faire un "
print
" méthode (un raccourci) qui prend un nombre variable d'arguments ET de gravures des tableaux et des listes de bien. Mais pour se différencierprint(1,2,3)
etprint(new int[]{1,2,3})
, je ne peux pas utiliserprint(Object... args)
, mais besoin de déclarer des méthodes commeprint(Object arg0,Object arg1,Object arg2)
pour tous les nombres possibles. Je vais donc mettre de 256print
les méthodes dans un (horrible à la recherche), puis une de plus pour 257+ arguments (qui fonctionne réellement avec laObject...
notation).
Vous devez vous connecter pour publier un commentaire.
Cette limite est définie dans le Spécification de la JVM:
Section §4.3.3 donne quelques informations supplémentaires:
Vos observations étaient sur place, mot double primitives (
long
/double
) besoin de deux fois la taille de 4 octets variables et 4 octets de l'objet de l'instance références.Concerne la dernière partie de votre question en rapport avec les systèmes 64 bits, le cahier des charges définit combien de unités d'un paramètre de contribuer, la partie de la spécification doivent toujours être respectés même sur une plate-forme 64 bits, le 64 bits JVM va l'accueillir 255 paramètres d'instance (comme votre 255
Strings
), indépendamment de l'objet interne de la taille du pointeur.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 32 bits de l'époque.javac
de trouver un moyen pour coder en Java paramètres de la méthode que de la JVM des paramètres de la méthode.)double...params
. C'est une autre affaire, non?Integer.MAX_VALUE-2
ou alors sur l'Oracle de la JVM. Pour les cas simples, il serait également possible de compiler le code source Java dans une manière qui fonctionne en bytecode, par exemple pour remplir un tableau avec la même valeur, vous n'avez pas besoin d'une instruction par matrice d'entrée. Vous n'avez pas besoin un code supplémentaire pournull
paramètres. Pour les non-trivial cas, vous atteindrez le byte code des limites avant même de tenter de remplir la temporaire varargs tableau.La Section 4.3.3 de la spécification de la JVM a l'information que vous recherchez:
Il apparaît donc que si l'hôte de la machine est de type 32 bits ou 64 bits n'a aucun effet sur le nombre de paramètres. Si vous remarquez, la documentation parle en termes de "parts", où la longueur d'une "unité" est une fonction de la parole-de la taille. Si le nombre de paramètres directement proportionnelle à la parole de la taille, il y aurait des problèmes de portabilité; vous ne seriez pas en mesure de compiler le même programme Java sur des architectures différentes (en supposant qu'au moins une méthode utilisée au maximum le nombre de paramètres sur l'architecture avec le mot-taille).
J'ai trouvé une question intéressante à partir d'un bulletin d'information à ce sujet, http://www.javaspecialists.eu/archive/Issue059.html