Ich hätte gerne eine Klasse, die die EnumMap emuliert, aber Int-Werte statt irgendeiner Art von Objekt speichert. Jetzt könnten Sie natürlich eine EnumMap erstellen, die auf Integer abgebildet wird, aber das ist eine Menge Autoboxing, die ich vermeiden möchte, wenn es möglich ist.Zugriff auf die .values () - und .ordinal() -Methode einer beliebigen Enumeration?
Also würde ich eine Klasse wie folgt erhalten:
public class EnumIntAttributeMap
{
enum Attribute
{
Height, Weight;
}
private final int[] values;
public EnumIntAttributeMap()
{
this.values = new int[Attribute.values().length];
}
public int getValue(Attribute a)
{
return this.values[a.ordinal()];
}
public void setValue(Attribute a, int value)
{
this.values[a.ordinal()] = value;
}
}
Außer, dass ich eine Version vornehmen möchten, die auf allen Aufzählungen generic ist. Jetzt, da die Methoden .values () und .ordinal() vom Compiler implizit hinzugefügt werden, scheint es, als wäre die einzige Möglichkeit, auf sie zuzugreifen, die Reflektion, die die Leistungsgewinne aufzehren würde, die ich zu vermeiden versuche Auto-Boxen, aber vielleicht gibt es etwas, das ich vermisse.
Irgendwelche Gedanken?
EDIT:
Ich glaube, meine erste Frage war unklar. Ich möchte eine Klasse, die (als generischer Parameter) eine Aufzählung akzeptiert und dann dieselben Operationen verwenden kann.
So könnte ich es mit jeder Art von enum verwenden, ohne die Klasse für jede Art von enum jedes Mal schreiben zu müssen. Wie zum Beispiel:
enum Attribute { Height, Weight }
enum AbilityScore {Str, Dex, Con, Int, Wis, Cha}
IdealClass<Attribute> attributeVersion;
IdealClass<AbilityScore> abilityScoreVersion;
und so weiter.
Wenn Ihre 'int'-Werte klein sind, dh im Cache, wird dies keinen Unterschied machen (BTW können Sie die Größe des Cache erhöhen). Wenn Sie jedoch int-Werte groß sind, könnte es Ihnen etwas Speicher/Müll. –
Ich sah, dass Sie den Integer-Cache mit einem Befehlszeilenargument erweitern können. Gibt es eine Möglichkeit, dies zu tun, nachdem das Programm aus dem Programm gestartet wurde? – Lokathor