¿Cuál es el número máximo de parámetros que puede tener un método en Java y por qué?
Estoy usando Java 1.8 en un sistema Windows de 64 bits.
Todas las respuestas en StackOverflow sobre esto dicen que el límite técnico es 255 parámetros sin especificar por qué.
Para ser precisos, 255 para los this
métodos estáticos y 254 para los no estáticos ( será el 255 en este caso).
Pensé que esto podría describirse en algún tipo de especificación y que simplemente se permite un número máximo de parámetros estáticamente definido.
Pero esto solo era válido para int
todos los tipos de 4 bytes . Hice algunas pruebas con long
parámetros, y solo pude declarar 127 parámetros en ese caso.
Con String
parámetros, el número permitido que deduje de las pruebas es 255 (¿puede ser porque el tamaño de referencia es de 4 bytes en Java?).
Pero como estoy usando un sistema de 64 bits, el tamaño de las referencias debe ser de 8 bytes de ancho y, por lo tanto, con los String
parámetros, el número máximo permitido debe ser 127, similar a los long
tipos.
¿Cómo se aplica exactamente este límite?
¿El límite tiene algo que ver con el tamaño de la pila del método?
Nota: Realmente no voy a utilizar estos muchos parámetros en ningún método, pero esta pregunta es solo para aclarar el comportamiento exacto.
<= 4
. Algo más probablemente debería estar envuelto en un objeto.Respuestas:
Ese límite se define en la especificación JVM :
La Sección §4.3.3 brinda información adicional:
Sus observaciones fueron acertadas, primitivas de doble palabra (
long
/double
) necesitan el doble del tamaño de las variables habituales de 4 bytes y referencias de instancia de objeto de 4 bytes .Con respecto a la última parte de su pregunta relacionada con los sistemas de 64 bits, la especificación define cuántas unidades contribuye un parámetro , esa parte de la especificación debe cumplirse incluso en una plataforma de 64 bits, la JVM de 64 bits acomodará 255 parámetros de instancia (como su 255
Strings
) independientemente del tamaño del puntero del objeto interno.fuente
long
edouble
independientemente de la arquitectura del sistema se produce en muchos lugares de la especificación y parece ser un remanente de la era de 32 bits.La Sección 4.3.3 de la especificación JVM tiene la información que está buscando:
Por lo tanto, parece que si la máquina host es de 32 bits o de 64 bits no tiene ningún efecto en la cantidad de parámetros. Si observa, la documentación habla en términos de "unidades", donde la longitud de una "unidad" es una función del tamaño de la palabra. Si el número de parámetros es directamente proporcional al tamaño de la palabra, habría problemas de portabilidad; no podría compilar el mismo programa Java en arquitecturas diferentes (suponiendo que al menos un método utilizara el número máximo de parámetros en la arquitectura con el tamaño de palabra más grande).
fuente
Encontré un tema interesante en un boletín sobre esto, http://www.javaspecialists.eu/archive/Issue059.html
fuente