Jaka jest maksymalna liczba parametrów, które może mieć metoda w Javie i dlaczego?
Używam języka Java 1.8 w 64-bitowym systemie Windows.
Wszystkie odpowiedzi na StackOverflow na ten temat mówią, że limit techniczny to 255 parametrów bez określenia dlaczego.
Dokładniej, 255 dla this
metod statycznych i 254 dla metod niestatycznych ( będzie to 255 w tym przypadku).
Pomyślałem, że można to opisać w jakiejś specyfikacji i że istnieje po prostu statycznie określona maksymalna liczba dozwolonych parametrów.
Ale dotyczyło to tylko int
i wszystkich typów 4-bajtowych . Zrobiłem kilka testów z long
parametrami i w tym przypadku byłem w stanie zadeklarować tylko 127 parametrów.
Z String
parametrami dozwolona liczba, którą wydedukowałem z testów, to 255 (może to być spowodowane tym, że rozmiar odniesienia wynosi 4 bajty w Javie?).
Ale ponieważ używam systemu 64-bitowego, rozmiar referencji powinien mieć szerokość 8 bajtów, więc przy String
parametrach maksymalna dozwolona liczba powinna wynosić 127, podobnie jak long
typy.
Jak dokładnie stosuje się ten limit?
Czy limit ma coś wspólnego z rozmiarem stosu metody?
Uwaga: tak naprawdę nie zamierzam używać tych wielu parametrów w żadnej metodzie, ale to pytanie ma na celu jedynie wyjaśnienie dokładnego zachowania.
<= 4
. Coś więcej powinno być prawdopodobnie zawinięte w przedmiot.Odpowiedzi:
Limit ten jest określony w specyfikacji maszyny JVM :
Sekcja §4.3.3 zawiera dodatkowe informacje:
Twoje obserwacje były trafne, podwójne prymitywy słów (
long
/double
) wymagają dwukrotnie większego rozmiaru niż zwykłe 4-bajtowe zmienne i 4-bajtowe odniesienia do instancji obiektu .Jeśli chodzi o ostatnią część twojego pytania dotyczącego systemów 64-bitowych, specyfikacja określa, ile jednostek ma dany parametr , ta część specyfikacji musi być nadal przestrzegana nawet na platformie 64-bitowej, 64-bitowa maszyna JVM będzie obsługiwać 255 parametrów instancji (tak jak 255
Strings
) niezależnie od rozmiaru wskaźnika obiektu wewnętrznego.źródło
long
idouble
niezależnie od architektury systemu występuje w wielu miejscach specyfikacji i wydaje się być pozostałością po ery 32-bitowej.Sekcja 4.3.3 specyfikacji maszyny JVM zawiera informacje, których szukasz:
Dlatego wydaje się, że to, czy maszyna hosta jest 32-bitowa, czy 64-bitowa, nie ma wpływu na liczbę parametrów. Jeśli zauważysz, dokumentacja mówi w kategoriach „jednostek”, gdzie długość jednej „jednostki” jest funkcją rozmiaru słowa. Gdyby liczba parametrów była wprost proporcjonalna do rozmiaru słowa, wystąpiłyby problemy z przenoszeniem; nie byłbyś w stanie skompilować tego samego programu Java na różnych architekturach (zakładając, że przynajmniej jedna metoda wykorzystywała maksymalną liczbę parametrów w architekturze z większym rozmiarem słowa).
źródło
Znalazłem interesujący numer z biuletynu na ten temat, http://www.javaspecialists.eu/archive/Issue059.html
źródło