Wie viele Parameter kann eine Methode in Java maximal haben und warum?
Ich verwende Java 1.8 auf einem 64-Bit-Windows-System.
Alle Antworten auf StackOverflow zu diesem Thema besagen, dass das technische Limit 255 Parameter beträgt, ohne anzugeben, warum.
Um genau zu sein, 255 für statische und 254 für nicht statische ( this
in diesem Fall 255.) Methoden.
Ich dachte, dies könnte in einer Art Spezifikation beschrieben werden und es gibt einfach eine statisch definierte maximale Anzahl von Parametern, die zulässig sind.
Dies galt jedoch nur für int
alle 4-Byte-Typen . Ich habe einige Tests mit long
Parametern durchgeführt und konnte in diesem Fall nur 127 Parameter deklarieren.
Mit String
Parametern ist die zulässige Zahl, die ich aus dem Testen abgeleitet habe, 255 (kann es sein, dass die Referenzgröße in Java 4 Byte beträgt?).
Da ich jedoch ein 64-Bit-System verwende, sollte die Referenzgröße 8 Byte breit sein, und daher sollte bei String
Parametern die maximal zulässige Anzahl 127 betragen, ähnlich wie bei long
Typen.
Wie wird diese Grenze genau angewendet?
Hat das Limit etwas mit der Stapelgröße der Methode zu tun ?
Hinweis: Ich werde diese vielen Parameter in keiner Methode wirklich verwenden, aber diese Frage dient nur dazu, das genaue Verhalten zu klären.
<= 4
. Alles andere sollte wahrscheinlich in ein Objekt eingewickelt werden.Antworten:
Diese Grenze ist in der JVM-Spezifikation definiert :
Abschnitt §4.3.3 enthält einige zusätzliche Informationen:
Ihre Beobachtungen waren genau richtig, Doppelwortprimitive (
long
/double
) benötigen die doppelte Größe der üblichen 4-Byte-Variablen und 4-Byte-Objektinstanzreferenzen .In Bezug auf den letzten Teil Ihrer Frage zu 64-Bit-Systemen definiert die Spezifikation, wie viele Einheiten ein Parameter beisteuert . Dieser Teil der Spezifikation muss auch auf einer 64-Bit-Plattform noch eingehalten werden. Die 64-Bit-JVM nimmt 255 Instanzparameter auf (wie Ihre 255)
Strings
) unabhängig von der Zeigergröße des internen Objekts.quelle
long
unddouble
unabhängig von der Systemarchitektur findet an vielen Stellen der Spezifikation statt und scheint ein Überbleibsel der 32-Bit-Ära zu sein.Abschnitt 4.3.3 der JVM-Spezifikation enthält die Informationen, nach denen Sie suchen:
Daher scheint es keinen Einfluss auf die Anzahl der Parameter zu haben, ob der Host-Computer 32-Bit oder 64-Bit ist. Wenn Sie bemerken, spricht die Dokumentation von "Einheiten", wobei die Länge einer "Einheit" eine Funktion der Wortgröße ist. Wenn die Anzahl der Parameter direkt proportional zur Wortgröße wäre, gäbe es Portabilitätsprobleme. Sie könnten nicht dasselbe Java-Programm auf verschiedenen Architekturen kompilieren (vorausgesetzt, mindestens eine Methode verwendet die maximale Anzahl von Parametern in der Architektur mit der größeren Wortgröße).
quelle
Ich fand eine interessante Ausgabe aus einem Newsletter dazu, http://www.javaspecialists.eu/archive/Issue059.html
quelle