Java приведение типа Long к типу Enum - PullRequest
3 голосов
/ 29 августа 2011

У меня была небольшая проблема с приведением типа Java long к типу Enum, и я не могу найти решение, как это сделать.

Вот что я использую:

public enum DataType {
    IMAGES(1),
    VIDEOS(2);

    private int value;
    private DataType(int i){
        this.value = i;
    }
}

и мне нужно сделать что-то вроде этого:

DataType dataType;
String thiz = "1";
long numb = Long.parseLong(thiz);
dataType = numb;

Я получаю сообщение об ошибке:

Преобразование numb в DataType или преобразование dataType в long.

Второй сценарий:

У меня есть это:

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.

Я пытался преобразовать это в String [] и использовать valueOf, но

Любые предложения, как заставить мысли работать?

Заранее спасибо!

Ответы [ 5 ]

12 голосов
/ 29 августа 2011

Enum уже предоставляет уникальное целое число для каждого из его экземпляров.Проверьте ordinal().(Обратите внимание, что он основан на нуле.)

Если вам нужно перейти от long к DataType, вы можете сделать

DataType dataType;
String thiz;
long numb = Long.parseLong(thiz);
dataType = DataType.values()[(int) numb];

Полный список преобразований из идля перечисления констант, строки и целые числа можно найти в этом ответе:

6 голосов
/ 29 августа 2011

В дополнение к ответу @ aioobe вы можете использовать свой собственный метод getInstance. Это обеспечит большую гибкость, поскольку вы не будете зависеть от порядкового номера.

public enum DataType {
    .
    .
    public static final DataType getInstance(final int i){
        for(DataType dt: DataType.values()){
            if(dt.value == i){
                return dt;
            }
        }

        return null;
    }
}
5 голосов
/ 29 августа 2011

Если по какой-то причине вам нужно самостоятельно присвоить номера и, следовательно, вы не можете использовать хорошее решение aioobe, вы можете сделать что-то вроде следующего:

public enum DataType {
    IMAGES(1),
    VIDEOS(2);

 private final int value;
 private DataType(int i){
    this.value=i;
 }
 public static DataType getByValue(int i) {
     for(DataType dt : DataType.values()) {
         if(dt.value == i) {
             return dt;
         }
     }
     throw new IllegalArgumentException("no datatype with " + i + " exists");
 }

Статический метод getByValue() ищет DataType с указанным номером.

3 голосов
/ 29 августа 2011

Правильный ответ от aioobe.Может быть, есть еще какие-то проблемы?

Вы могли бы лучше использовать int вместо long для индекса enum.Это может быть как:

String indexAsString;
int index = Integer.parseInt(indexAsString)-1;
DataType dataType = DataType.values()[index];

Обратите внимание на «-1», так как массивы начинаются с нуля, а ваш индекс - на основе единицы.

2 голосов
/ 29 августа 2011

ordinal () будет работать, если числа, которые вы передаете в перечисление, являются индексами, а не каким-либо произвольным кодом, таким как разрешение или число символов в строке.

Я бы расширил перечисление методом accesor для значения, индексом разрешения и статическим методом, который разрешает число в значение Enum. Вот, пожалуйста ...

public enum DataType {
       IMAGES(1),
       VIDEOS(2);
    private int value;

    DataType(int i){
       this.value=i;
    }

    static final Map<Integer,DataType> inverseIndex;
    static {
        inverseIndex = new HashMap<Integer,DataType> ();
        for (DataType dt:DataType.values()) {
            inverseIndex.put(dt.getValue(), dt);
        }   
    }

    public int getValue() {
        return value;
    }

    public static DataType resolve(int number) {
        return inverseIndex.get(number);
    }
}

Обратите внимание, что это решение не будет работать, если ваша карта Enum-значение не является биективной, поэтому вы можете иметь только отдельные значения для перечислений в вашем enumType.

...