Die Hauptuntersuchung in diesem Artikel ist der relevante Inhalt von ENUMMAP anstelle des Ordinalindex in Java, der wie folgt eingeführt wird.
Studie Notizen "Effektive Java Chinese Edition 2"
Es wird häufig unter Verwendung der Ordnungsmethode von Enum angetroffen, um Enum -Typen zu indexieren.
public class Herb {public enum type {jährlich, mehrjährig, zweijährliches}; private endgültige Zeichenfolge Name; privater Endtyp; Herb (String -Name, Typtyp) {this.name = name; this.type = Typ; } @Override public String toString () {return name; }}Nehmen wir nun an, es gibt eine Reihe von Kräutern, die Pflanzen in einem Garten repräsentieren, den Sie nach Typ (jährlich, mehrjährig oder zweijährlich) organisieren möchten, bevor Sie diese Pflanzen auflisten. Wenn Sie dies tun möchten, müssen Sie drei Sätze bauen, einen für jeden Typ, und durch den gesamten Garten iterieren und jedes Kraut in den entsprechenden Satz legen. Einige Programmierer tun dies, indem sie diese Sätze in ein Array einfügen, das durch ordinale Anzahl von Typen indiziert ist.
// Verwenden von ordinal (), um ein Array zu indexieren - tu thisherb [] garden = ...; // durch herb.type.ordinal () set <Herb> [] HerbsByPe = (set <herb> []) neuer Set [Herb.Type.Values (). Länge]. für (int i = 0; i <HerbsByType.length; i ++) {HerbsByType [i] = new Hashset <Herb> ();} für (Herb h: garten) {HerbsBytype [H.Typin.Ordinal ()]. System.out.printf ("%s:%s%n", Herb.Type.Values () [i], HerbsBytype [i]);}Diese Methode ist in der Tat machbar, verbirgt aber viele Probleme. Weil Arrays nicht mit Generika kompatibel sind. Das Programm muss ungeprüfte Conversions durchführen und kann nicht korrekt kompiliert werden. Da das Array nicht weiß, was sein Index darstellt, müssen Sie die Ausgabe dieser Indizes manuell kennzeichnen. Das schwerwiegendste Problem bei dieser Methode ist jedoch, dass wenn Sie auf ein von der Aufzündungsnummer indiziertes Array zugreifen, es in Ihrer Verantwortung liegt, den richtigen Int -Wert zu verwenden. Int kann keine Sicherheit für Enums bereitstellen. Wenn Sie den falschen Wert verwenden, wird das Programm die falsche Arbeit leise abschließen, oder wenn Sie Glück haben, wird eine Ausnahme von ArrayIndexoutOfBoundException ausgelöst.
java.util.enummap ist eine sehr schnelle Kartenimplementierung, die speziell für die Aufzählung verwendet wird.
// Verwenden Sie ein Enummap, um Daten mit einem Enummap <Herb.Type zu verknüpfen, <Herb >> HerbsByType = New Enummap <Herb.Type, setzen Sie <Herb >> (Herb.Type.ClASS); für (Herb.Type T: Herb.Type.Values) HerbsByType.put (t, neuer Hashset <HERB> ()); für (Herb H: Garden) Herbsbytype.get (H.Type) .Add (h); System.out.println (HerbsByType);
Dieses Programm ist kürzer, klarer und sicherer und kann mit einer Geschwindigkeit ausgeführt werden, die mit dem von Programmen vergleichbar ist, die Ordnungszahlen verwenden. Es hat keine unsicheren Konvertierungen; Es muss nicht die Ausgabe dieser Indizes manuell kennzeichnen, da die Mapping -Tasten wissen, wie sie sich in eine Aufzählung druckbarer Zeichenfolgen übersetzen können. Es ist auch unmöglich, Fehler bei der Berechnung von Array -Indizes zu machen . Der Grund, warum EnumMap mit Arrays vergleichbar ist, die durch Ordinalindizes in Bezug auf die Laufgeschwindigkeit indiziert sind, ist, dass Enummap dieses Array intern verwendet. Aber es verbirgt diese Art von Gedankendetails von Programmierern und kombiniert die reichhaltige Funktionalität von Karte und die Sicherheit mit der Geschwindigkeit der Arrays. Beachten Sie, dass der ENUMMAP -Konstruktor ein Schlüsseltypklassenobjekt verwendet: Dies ist ein begrenzter Token, der renne generische Informationen liefert.
Zusammenfassen
Das obige ist die detaillierte Erläuterung von ENUMMAP anstelle des Ordnungsindexcode in Java. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!