Qual é o número máximo de parâmetros que um método em Java pode ter e por quê?
Estou usando o Java 1.8 em um sistema Windows de 64 bits.
Todas as respostas no StackOverflow sobre isso dizem que o limite técnico é de 255 parâmetros sem especificar o porquê.
Para ser mais preciso, 255 para this
métodos estáticos e 254 para não estáticos ( será o 255º neste caso).
Eu pensei que isso poderia ser descrito em algum tipo de especificação e que simplesmente existe um número máximo de parâmetros estaticamente definido permitido.
Mas isso era válido apenas para int
todos os tipos de 4 bytes . Fiz alguns testes com long
parâmetros e só pude declarar 127 parâmetros nesse caso.
Com os String
parâmetros, o número permitido deduzido do teste é 255 (pode ser porque o tamanho de referência é 4 bytes em Java?).
Mas como eu estou usando um sistema de 64 bits, o tamanho das referências deve ter 8 bytes de largura e, com os String
parâmetros, o número máximo permitido deve ser 127, semelhante aos long
tipos.
Como esse limite é aplicado exatamente?
O limite tem algo a ver com o tamanho da pilha do método?
Nota: Eu realmente não vou usar esses muitos parâmetros em nenhum método, mas essa pergunta é apenas para esclarecer o comportamento exato.
<= 4
. Qualquer coisa mais provavelmente deve ser embrulhada em um objeto.Respostas:
Esse limite é definido na Especificação da JVM :
A seção §3.3.3 fornece algumas informações adicionais:
Suas observações foram pontuais; as primitivas de palavra dupla (
long
/double
) precisam do dobro do tamanho das variáveis usuais de 4 bytes e das referências de instância do objeto de 4 bytes .Em relação à última parte da sua pergunta relacionada aos sistemas de 64 bits, a especificação define quantas unidades um parâmetro contribui , que parte da especificação ainda deve ser cumprida, mesmo em uma plataforma de 64 bits, a JVM de 64 bits acomodará 255 parâmetros de instância (como o seu 255
Strings
) independentemente do tamanho do ponteiro do objeto interno.fonte
long
e,double
independentemente da arquitetura do sistema, ocorre em muitos locais das especificações e parece ser um remanescente da era de 32 bits.A Seção 4.3.3 da especificação da JVM contém as informações que você está procurando:
Portanto, parece que se a máquina host é de 32 ou 64 bits não afeta o número de parâmetros. Se você notar, a documentação fala em termos de "unidades", onde o comprimento de uma "unidade" é uma função do tamanho da palavra. Se o número de parâmetros diretamente proporcionais ao tamanho da palavra, haveria problemas de portabilidade; você não seria capaz de compilar o mesmo programa Java em arquiteturas diferentes (supondo que pelo menos um método usasse o número máximo de parâmetros na arquitetura com o tamanho de palavra maior).
fonte
Encontrei uma questão interessante em um boletim informativo sobre isso, http://www.javaspecialists.eu/archive/Issue059.html
fonte