Was würden Sie für effizienter halten?
Die Verwendung von 'WeekDay' ist nur ein Beispiel:
%Vor%Wiederholen Sie den Vorgang und überprüfen Sie die Tag-Zeichenfolge zuerst:
%Vor%Oder da in 99,99% der Fälle der Tag richtig ist:
%Vor%Aktualisieren :
Um klarzustellen, kommt die Eingabezeichenfolge von einer Client-Anwendung und nicht von einem Benutzer. Mit anderen Worten, es wäre ein Fehler, in diesem Beispiel einen Nicht-Arbeitstag zu erhalten.
Ich weiß, es ist ein alter Post, aber ich glaube, das folgende Ergebnis wird noch interessant sein. Ich führe 10000000 Tests durch, um ein Element in enum ENUM {FIRST, SECOND, THIRD, FOURTH, LAST}
mit JDK 1.8 zu finden. Die folgende Tabelle zeigt die Zeit, die für die einfache Schleife und valueOf()
benötigt wird.
Fazit - Ich würde valueOf()
nicht verwenden, wenn ich Werte erwarte, die nicht mit enum übereinstimmen.
Was ist das Leistungsbedenken bezüglich des 2. Ansatzes? Eine solche Ausnahme zu fangen kostet fast nichts. Das Verwenden von Ausnahmen für den normalen Steuerungsablauf ist im Allgemeinen eine schlechte Idee aus der Entwurfsperspektive. Die Zeiten, in denen dies eine Leistungsüberlegung war, sind lange vorbei. In einem Debugger wird die Verwendung von Ausnahmen als wichtige Steuerungsoperationen die Geschwindigkeit um einen Faktor von etwa 10 verringern. Dies wird jedoch durch das JIT optimiert und es gibt keine messbaren Auswirkungen auf die Produktion.
Diese Zahlen beruhen auf Erfahrungen mit einer Auswertung des zxing-Projekts, die Ausnahmen für alle Arten der Flusssteuerung verwendet. Als ich es zum ersten Mal sah, war ich entsetzt. Ich denke immer noch, dass es nicht das beste Design ist, aber ich habe ziemlich viel getestet und kann mit ein bisschen Zuversicht sagen, dass es keinen wirklichen Einfluss auf die Performance hatte. Und das ist ein Algorithmus, der überall Ausnahmen für die Ablaufsteuerung verwendete. Ihre Situation, in der die Ausnahme nur in Ausnahmefällen ausgelöst wird, ist kein Problem.
Edit: Ich hatte ein oder zwei Downvotes zu meiner Antwort, und ich möchte sicherstellen, dass ich mir klar darüber bin, was ich sage: Ich denke nicht, dass es eine gute Idee ist, Ausnahmen für normal zu verwenden Kontrollfluss. Nur weil Leistung kein gutes Argument dafür ist, Ausnahmen nicht zu verwenden, bedeutet dies nicht, dass es keine anderen, vollkommen gültigen Gründe (wie Lesbarkeit, Testbarkeit, Erweiterbarkeit) gibt. Im Fall des OP ist die Verwendung einer Ausnahme absolut erforderlich und würde definitiv kein Leistungsproblem verursachen.
Wie bereits erwähnt, müssen Sie sich profilieren, um sicher zu sein. Selbst in Ihrem eigenen Parsing-Ansatz können Sie es schneller machen, indem Sie beim Analysieren der Liste die Enumeration zurückgeben.
%Vor%Wenn es sich nicht um ein zeitkritisches Stück einer Anwendung handelt, würde ich mich in beiden Fällen nicht darum kümmern und einfach den lesbarsten Ansatz wählen. Ich denke, das wäre die WeekDay.valueOf () Methode.
Wenn Sie nicht mit Ausnahmen arbeiten möchten, erstellen Sie eine Map Ihrer Werte innerhalb der Enumeration und führen Sie effektiv das Äquivalent von valueOf () aus einer Suche aus, die null zurückgibt, wenn sie nicht gefunden wird.
%Vor%Dies ist effektiv, was die valueOf () -Methode ohnehin macht, außer dass sie die IllegalArgumentException auslöst, wenn sie nicht gefunden wird. Dieser Ansatz wird einfach null zurückgeben und somit den Stacktrace nicht erzeugen.
Speichern Sie die gültigen Zeichenfolgen in HashSet
und entscheiden Sie, ob eine Zeichenfolge ein gültiger Tag ist oder nicht, basierend auf Set.contains(...)
.
Der Satz kann ein static final Set
sein, und Sie können in ein unmodifizierbares Maß einfügen:
Die Schleife tut nichts, was der aufrufende Wert nicht hat, sie haben die gleiche Funktionalität: Sie prüfen, ob Ihre Zeichenfolge gültig ist. Was glauben Sie, dass Sie von der ersten Option profitieren?
Die zweite Option ist am besten:
%Vor%Oder Sie könnten ein Nachschlagen von Aufzählungswerten in Ihrer Aufzählung erstellen, wenn die Klasse zuerst geladen wird (siehe statischer Modifikator) und mit get () validieren, wie unten gezeigt:
%Vor%Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen