Warum kann Ihr Switch-Statement-Datentyp nicht lang sein, Java?
Hier ein Auszug aus Sun ' s Java tutorials:
Einen Schalter arbeitet mit der
byte
short
char
undint
primitiven Datentypen. Es funktioniert auch mit Aufzählungstypen (diskutiert in den Klassen und Vererbung) und ein paar spezielle Klassen, die "wrap" bestimmte primitive Typen:Character
Byte
Short
undInteger
(diskutiert in Einfache Daten-Objekte).
Muss es einen guten Grund, warum die long
primitiven Datentyp ist nicht zulässig. Wer weiß, was es ist?
InformationsquelleAutor der Frage Fostah | 2010-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, zum Teil war es wohl eine willkürliche Entscheidung basiert auf den typischen Einsatz von switch.
Einen Schalter kann im wesentlichen auf zwei Arten implementiert werden (oder im Prinzip eine Kombination): für eine kleine Anzahl von Fällen oder um solche, deren Werte sind weit verstreut, ein Schalter im wesentlichen wird die Entsprechung einer Reihe von ifs, die auf eine temporäre variable (der Wert wird eingeschaltet, muss nur einmal bewerten). Eine moderate Anzahl von Fällen, die mehr oder weniger aufeinander folgenden Mehrwert, einen switch-Tabelle verwendet wird (die TABLESWITCH-Anweisung in Java), wobei die Position, zu der gesprungen ist, effektiv blickte in eine Tabelle.
Dieser Methoden könnte im Prinzip ein long-Wert, anstatt eine ganze Zahl. Aber ich denke, es war wohl nur eine praktische Entscheidung, um die balance die Komplexität der Befehlssatz und compiler mit dem tatsächlichen Bedarf: die Fälle, wo Sie wirklich brauchen, um den Schalter über einen langen sind selten genug, dass es akzeptabel ist zu haben, um neu zu schreiben, als eine Serie von IF-Anweisungen, oder Arbeit, die Runde in anderer Form (wenn die long-Werte in Frage, die nahe beieinander liegen, können Sie in Ihrem Java-code-Schalter über das int-Ergebnis der Subtraktion der niedrigste Wert).
InformationsquelleAutor der Antwort Neil Coffey
Weil Sie nicht implementieren die notwendigen Anweisungen in den bytecode und Sie wirklich nicht schreiben wollen, dass viele Fälle, egal wie "Produktion ready" dein code ist...
[EDIT: Extrahiert aus Kommentare auf diese Antwort, mit einigen Ergänzungen auf hintergrund]
Um genau zu sein, der 232 ist ein viel von Fällen, und alle Programme, die mit einer Methode lang genug, um mehr als das ist absolut entsetzlich! In jeder Sprache. (Die längste Funktion kenne ich in jedem code in jeder Sprache ein wenig über 6k SLOC – ja, es ist eine große
switch
– und es ist wirklich unüberschaubar.) Wenn Sie wirklich stuck sind, dass einelong
wo sollten Sie nur einenint
oder weniger, dann hast du zwei echte alternativen.Verwenden eine Variante des Themas von hash-Funktionen zum komprimieren der
long
in eineint
. Der einfachste, nur für die Verwendung, wenn Sie haben die falsche, ist nur Schauspieler! Sinnvoller wäre, dies zu tun:vor dem Wechsel auf das Ergebnis. Sie müssen herausfinden, wie zu transformieren sind die Fälle, die Sie gegen zu testen. Aber wirklich, das ist immer noch schrecklich, da es nicht das eigentliche problem in vielen Fällen.
Eine viel bessere Lösung, wenn Sie arbeiten mit einer sehr großen Anzahl von Fällen, ändern Sie Ihre design um mit einem
Map<Long,Runnable>
oder etwas ähnliches, so dass Sie nachschlagen, wie der Versand zu einem bestimmten Wert. Dies ermöglicht Ihnen, zu trennen die Fälle, die in mehrere Dateien, die viel einfacher zu verwalten, wenn der Fall-count bekommt große, aber es ist schwieriger zu organisieren, die Registrierung des host-Implementierung von Klassen beteiligt sind (Anmerkungen, die vielleicht helfen, indem Ihnen die Erstellung der Registrierungs-code automatisch).FWIW, ich habe das vor vielen Jahren (wir wechselten zu den neu veröffentlichten J2SE 1.2 Teil des Weges durch das Projekt) beim erstellen einer benutzerdefinierten bytecode-engine für die Simulation von Massiv-parallele hardware (keine Wiederverwendung der JVM wäre nicht geeignet, aufgrund der radikal unterschiedlichen Wert und die Ausführung der Modelle beteiligt ist) und es enorm vereinfacht den code relativ zu den großen
switch
dass die C-version der code wurde mit.Bekräftigen die take-home-message, wollen
switch
auf einelong
ist ein Indiz dafür, dass entweder du hast die Typen falsch in deinem Programm oder du baust ein system mit so viel variation beteiligten, dass Sie sollten mit Klassen. Zeit für ein Umdenken in jedem Fall.InformationsquelleAutor der Antwort Donal Fellows
Weil der lookup-Tabelle-index muss 32 bit.
InformationsquelleAutor der Antwort JRL
Eine lange, im 32-bit-Architekturen ist durch zwei Worte repräsentiert. Nun, sich vorstellen, was passieren könnte, wenn aufgrund unzureichender Synchronisation, für die Ausführung der switch-Anweisung beobachtet lange mit seinen hohen 32-bits von eins zu schreiben, und die 32 low von anderen! Könnte es versuchen zu gehen ....wer weiß wo! Im Grunde irgendwo zufällig. Auch wenn beide schreibt vertreten Gültiger Fälle für die switch-Anweisung, mit Ihren lustigen Kombination würde wahrscheinlich dazu führen, die weder auf den ersten noch auf den zweiten -- oder extrem schlimmer noch, es könnte zu einem anderen gültigen, aber nicht verwandten Fall!
Mindestens mit int (oder weniger Arten), egal wie schlecht Sie es vermasseln, wird die switch-Anweisung mindestens Lesen einen Wert, der eigentlich jemand schriebanstelle des Wertes "out of thin air".
Natürlich, ich weiß nicht, der eigentliche Grund ist (es ist seit mehr als 15 Jahren, ich habe nicht aufgepasst, dass die lange!), aber wenn Sie merken, wie unsicher und unberechenbar wie ein Konstrukt sein könnte, Sie werden mir Zustimmen, dass dies ist ein definitiv sehr guten Grund nicht immer über einen Schalter auf longs (und wie lange -Wortspiel beabsichtigt - es werden die 32bit-Maschinen, deshalb bleibt).
InformationsquelleAutor der Antwort Dimitris Andreou