Gibt es etwas wie branch/jump-Tabelle in Java?
Tut Java haben so etwas ähnliches wie ein branch-oder jump-Tabelle?
Einem branch oder jump-Tabelle ist, laut wikipedia,
ein Begriff verwendet, um zu beschreiben, eine effiziente Methode für die übertragung der Programmsteuerung (Verzweigungen) zu einem anderen Teil ein Programm (oder ein anderes Programm gewesen sein kann, die dynamisch geladen werden) mit Hilfe einer Tabelle von branch-Instruktionen.
Macht Java so etwas haben oder tun, ich habe nur zu verwenden if/else if/else-oder case-Anweisungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java hat eine switch-Anweisung, aber ob es kompiliert, um eine jump-Tabelle der bytecode ist von der Implementierung abhängig. Im Allgemeinen, Compiler bauen Sie ein Sprung-Tabelle, wenn Sie finden, nette Konstanten, die für jeden Fall in deiner switch-Anweisung. Ich bin mir nicht sicher, sollte wirklich egal sein, wie es implementiert ist, obwohl. Wenn Sie die Programmierung in Java auf den ersten Platz, du bist wahrscheinlich gerade fein Vermietung der compiler und der JIT-kümmern sich um diese Dinge für Sie.
Beachten Sie, dass der Schalter funktioniert nur mit ganzzahligen primitiven Datentypen und Enumerationen, so dass Sie tun benutzen müssen, um if/else-Anweisungen wenn Sie ein anderes Objekt-Typen (und Sie sollte das wohl nicht vergleichen, doubles oder floats für die Gleichstellung sowieso).
Schließlich, obwohl enum Verweise sind technisch "Konstante", einige Compiler erzeugen Sie eine Sprung-Tabelle, wenn Sie wechseln auf enums wenn Ihre switch-Anweisung ist in der selben compilation unit, wo die enum definiert ist. Andernfalls erzeugen Sie eine if/else Kette (so, als würden Sie zu tun haben, für normale Objekte). Für die nitty gritty details, siehe die java.net Foren zu erweitern wechseln Sie Verwendung für Objekte.
Ich denke, case-Anweisungen ( mit dem Schalter in java ) entspricht.
Zusätzlich in OOP den Schalter konnte codiert werden, einmal und dann lassen Polymorphismus auf den job.
Aus : http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html
Es hängt von Ihren Anforderungen ab.
Einer Weise zu übertragen, wird die Programmsteuerung zum Aufruf einer Funktion. Eine Möglichkeit zum Aufruf der richtigen Funktion, wenn Sie mehrere haben, zum von zu wählen, ist die Taste, schalten Sie den Typ eines Objekts. Das nennt man Polymorphismus. Java und andere objektorientierte Sprachen Polymorphismus, umgesetzt durch Vererbung (subclassing). Nicht sicher, wie es ist implementiert in Java, aber in C++ gibt es (in der Regel? oder immer?) ein Zeiger in jedem Objekt, das auf die v-Tabelle s-Klasse, die enthält Zeiger auf virtuelle Funktionen.
Aber ich bezweifle, dass das fehlen einer Benutzer-definierten Sprung Tabelle ist, verkrüppeln Sie die Leistung Ihrer java-Anwendung.
Ja, absolut.
Wenn Sie den code einer switch-Anweisung wird dann je nach der verschiedenen Dinge, die schalten werden in einer tableswitch-Anweisung in bytecode. In der Regel
Den einfachsten Weg zu erreichen, ist die Verwendung von java-enums, die behandelt werden, speziell durch den compiler. Die entsprechende Dokumentation ist in der Java Virtual Machine Specification. Natürlich, der JIT-compiler fast sicher, konvertiert diese direkt ins sehr schnell switches in der Computer-code von was auch immer-Plattform, die Sie ausführen auf.
Having said that, die real Antwort auf Ihre Frage ist "dies ist die Art von Sache, die Sie befürchten, wenn Sie tun, machine code, nicht die Programmierung in high-level-Sprache".
Ich glaube nicht, dass Sie brauchen diese Art von Leistung, die hacks in Java. Ich würde konzentrieren sich in Erster lesbaren code schreiben und mit anständigen algorithmen - diese bringen mehr Leistung nutzen, als das, was Sie diskutieren.
In den meisten standalone-Anwendungen, die überwiegende Mehrheit der Zeit damit verbracht wird, sitzen herum und warten für den Benutzer, etwas zu tun. In den meisten web-Anwendungen, die Menge der Zeit, ausführen von bytecode in der JVM sollte überschwemmt werden von Netzwerk-Zeit -, Datenbank -, Zeit-oder business-Logik.
Wenn Sie wirklich besorgt über die Leistung der Teil der Java-app, die Sie verschieben können, es in JNI-code und Umgehung der Java-interpreter zusammen.
Ich denke das ist, wie einige switch-Anweisungen umgesetzt werden "unter der Haube", sozusagen.
Andere als das, Sie könnten etwas ähnliches machen, mit etwas
HashMap<whatever, Method>
, wo Siemap.get(something).invoke()
. Aber diese Art von Niederlagen der Zweck, denn es wäre nicht so schnell wie eine jump-Tabelle haben, und ich kann nicht denken, ein guter Fall, in dem OOP-Programmierung/Polymorphie nichts zu tun, den job besser und sauberer.Die Art der Verzweigung/Sprung-Tabellen denen du sprichst, sind nicht direkt mit high-level-Sprachen wie Java, C, etc., aber die generiert werden durch Compiler in Maschinensprache oder byte-code. In anderen Worten, der compiler darf Sie benutzen, aber Sie sehen Sie nicht.
Können Sie enum verwenden, dies zu tun.
Man könnte dies mit reflection und generische HashMap gespeichert sind anonyme innere Klassen, aber es wäre eine schreckliche hack.
Es ist wirklich elegant zu machen in C# durch native anonyme Methoden, aber nicht in java.