Weil sie nicht die notwendigen Anweisungen im Bytecode implementiert haben und Sie wirklich nicht so viele Fälle schreiben möchten, egal wie "produktionsbereit" Ihr Code ist ...
[EDIT: Auszug aus Kommentaren zu dieser Antwort, mit einigen Ergänzungen im Hintergrund]
Um genau zu sein, 2³² sind viele Fälle und jedes Programm mit einer Methode, die lang genug ist, um mehr als das zu halten, wird absolut schrecklich sein! In jeder Sprache. (Die längste Funktion, die ich in einem Code in einer Sprache kenne, ist etwas mehr als 6 KB SLOC - ja, es ist eine große switch
- und sie ist wirklich nicht zu handhaben.) Wenn Sie wirklich nicht wissen , long
wo Sie nur eine int
oder weniger haben sollten, dann hast du zwei echte Alternativen.
Verwenden Sie eine Variante zum Thema Hash-Funktionen, um die long
in eine zu komprimieren int
. Die einfachste Möglichkeit, nur wenn Sie den falschen Typ haben, ist das Casting! Nützlicher wäre dies:
(int) ((x&0xFFFFFFFF) ^ ((x >>> 32) & 0xFFFFFFFF))
vor dem Einschalten des Ergebnisses. Sie müssen herausfinden, wie Sie die Fälle, gegen die Sie testen, auch transformieren können. Aber wirklich, das ist immer noch schrecklich, da es nicht das eigentliche Problem vieler Fälle anspricht.
Eine viel bessere Lösung, wenn Sie mit einer sehr großen Anzahl von Fällen arbeiten, besteht darin, Ihr Design auf die Verwendung eines Map<Long,Runnable>
oder eines ähnlichen zu ändern , damit Sie nachschlagen können, wie ein bestimmter Wert versendet wird. Auf diese Weise können Sie die Fälle in mehrere Dateien aufteilen. Dies ist viel einfacher zu verwalten, wenn die Anzahl der Fälle groß wird. Die Organisation der Registrierung des Hosts der beteiligten Implementierungsklassen wird jedoch komplexer (Anmerkungen können hilfreich sein, indem Sie dies zulassen) Registrierungscode automatisch erstellen).
FWIW, ich habe dies vor vielen Jahren getan (wir haben im Verlauf des Projekts auf das neu veröffentlichte J2SE 1.2 umgestellt), als ich eine benutzerdefinierte Bytecode-Engine zur Simulation massiv paralleler Hardware erstellt habe (nein, die Wiederverwendung der JVM wäre aufgrund der radikalen Situation nicht geeignet gewesen verschiedene Wert- und Ausführungsmodelle beteiligt) und es hat den Code im Vergleich zu dem großen switch
, den die C-Version des Codes verwendete, enorm vereinfacht .
Um die Take-Home - Nachricht wiederholen, zu wollen , switch
auf eine long
ist ein Hinweis darauf , dass Sie entweder die Typen in Ihrem Programm falsch haben oder dass Sie bauen ein System mit so viel Variation beteiligt , dass Sie sollten mithilfe von Klassen werden. In jedem Fall Zeit zum Umdenken.