Java cast Lange Enum-Typ Problem
Hatte ich ein kleines problem mit casting-Java long-Datentyp Enum-Typ und kann nicht finden, eine Lösung, wie das zu tun.
Hier ist, was ich verwende :
public enum DataType {
IMAGES(1),
VIDEOS(2);
private int value;
private DataType(int i){
this.value = i;
}
}
und ich brauche etwas wie das hier tun:
DataType dataType;
String thiz = "1";
long numb = Long.parseLong(thiz);
dataType = numb;
Die Fehler, die ich bekomme sagt:
Konvertieren taub, um ein Datentyp oder Datentyp konvertieren zu lange.
Zweite Szenario:
Habe ich dieses :
static String[] packetType;
String tmp=incomingData.toString(); //where incomingData is byte[]
int lastLoc = 0;
int needsSize = packetFieldSizes[tmpCurrentField-1]; //where packetFieldSizes,tmpCurrentField are integers.
thiz=tmp.substring(lastLoc, needsSize);
packetType=thiz; //packetType = thiz copy; where thiz is the same as used above.
Ich habe versucht, zu konvertieren thiz String [], und verwenden valueOf,aber
Irgendwelche Vorschläge, wie man das denkt, zu arbeiten?
Vielen Dank im Voraus!
- Sie können nicht mehr als ungefähr 30K enum-Werte, die macht
long
oder sogarint
overkill für das, was Sie brauchen. - also Sie empfehlen mir mit int statt long?
- es ist unklar, was Sie sich beziehen, mit "ich habe versucht, zu konvertieren zu einem String [], und verwenden valueOf".
- Beachten Sie auch, dass
String tmp=incomingData.toString(); // where incomingData is byte[]
ist anfällig für Fehler aufgrund von encoding-mismatch. Verwendennew String(byte[],charsetName)
- Sorry,es muss sein, ich habe versucht, zu konvertieren thiz in String[].
Du musst angemeldet sein, um einen Kommentar abzugeben.
Enum
liefert bereits eine eindeutige ganze Zahl für jeden der es-Instanzen. Check-outordinal()
. (Beachten Sie, dass es null-basiert obwohl.)Wenn Sie brauchen, um zu gehen von einem
long
zu einemDataType
Sie tun können,Vollständige Liste der Konvertierungen von und zu enum-Konstanten, Zeichenketten und ganzen zahlen finden Sie in dieser Antwort:
id
für jede enum-Konstante ist imho eine gute übung in Szenarien, in denen Sie diese IDs beibehalten, daordinal()
ändern können für den gleichen Artikel beim einfügen von neuen Konstanten, die in zwischen.DataType.values ()[(int) numb];
und ich denke, VIDEOS für 1L ist unerwartet.numb-1
benötigt wird.Neben @aioobe Antwort, könnten Sie Rollen Sie Ihre eigenen
getInstance
Methode. Dies würde mehr Flexibilität bieten, da Sie nicht abhängig von der Ordnungszahl.Wenn aus irgendeinem Grund Sie brauchen, um ordnen Sie die zahlen selbst und können somit auch nicht verwenden aioobe gute Lösung, können Sie etwas wie die folgende:
Die statische Methode
getByValue()
sucht für dieDataType
mit der Nummer.Richtige Antwort aus aioobe. Vielleicht einige andere Bedenken ?
Könnte man besser mit int statt long, für die enum-index.
Es könnte sein, wie :
Bitte beachten Sie die "-1", die als arrays sind null-basiert, während Ihr index ist ein index-basiert.
ordinal() arbeiten, wenn die zahlen, die Sie auf der Durchreise sind die enum sind Indizes und nicht beliebigen code, wie Auflösung oder Anzahl der Zeichen in einer Zeile.
Ich würde extends enum mit einer accesor-Methode für den Wert, die eine Auflösung von index und eine statische Methode, die behebt eine Zahl in eine Enum-Wert. Hier gehen Sie...
Beachten Sie, dass diese Lösung nicht funktioniert, ist deine Karte Enum-Wert ist nicht bijektive, so können Sie nur unterschiedliche Werte für Enumerationen, die in Ihrem enumType.