[Java] المدلى بها إلى التعداد في جاوة



Answers

MyEnum.values()[x] عملية مكلفة. إذا كان الأداء يمثل مصدر قلق ، فقد ترغب في القيام بشيء كالتالي:

public enum MyEnum {
    EnumValue1,
    EnumValue2;

    public static MyEnum fromInteger(int x) {
        switch(x) {
        case 0:
            return EnumValue1;
        case 1:
            return EnumValue2;
        }
        return null;
    }
}
Question

ما هي الطريقة الصحيحة لإدخال Int إلى تعداد في Java في التعداد التالي؟

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


MyEnum enumValue = (MyEnum) x; //Doesn't work???



enum MyEnum {
    A(0),
    B(1);
    private final int value;
    private MyEnum(int val) {this.value = value;}
    private static final MyEnum[] values = MyEnum.values();//cache for optimization
    public static final getMyEnum(int value) { 
        try {
            return values[value];//OOB might get triggered
        } catch (ArrayOutOfBoundsException e) {
        } finally {
            return myDefaultEnumValue;
        }
    }
}



يمكنني تخزين القيم مؤقتًا وإنشاء طريقة وصول ثابتة بسيطة:

public static enum EnumAttributeType {
    ENUM_1,
    ENUM_2;
    private static EnumAttributeType[] values = null;
    public static EnumAttributeType fromInt(int i) {
        if(EnumAttributeType.values == null) {
            EnumAttributeType.values = EnumAttributeType.values();
        }
        return EnumAttributeType.values[i];
    }
}



في حالة مساعدة الآخرين ، فإن الخيار الذي أفضِّله ، والذي لم يتم سرده هنا ، يستخدم وظيفة خرائط Guava :

public enum MyEnum {
    OPTION_1(-66),
    OPTION_2(32);

    private int value;
    private MyEnum(final int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    private static ImmutableMap<Integer, MyEnum> reverseLookup = 
            Maps.uniqueIndex(Arrays.asList(MyEnum.values())), MyEnum::getValue);

    public static MyEnum fromInt(final int id) {
        return reverseLookup.getOrDefault(id, OPTION_1);
    }
}

مع الافتراضي يمكنك استخدام null ، يمكنك throw IllegalArgumentException أو قد يعود fromInt الخاص بك Optional ، أيا كان السلوك الذي تفضله.




استخدم MyEnum enumValue = MyEnum.values()[x];




خيار جيد هو تجنب التحويل من int إلى enum : على سبيل المثال ، إذا كنت بحاجة إلى القيمة القصوى ، فيمكنك مقارنة x.ordinal () بـ y.ordinal () وإرجاع x أو y بالمقابل. (قد تحتاج إلى إعادة ترتيب القيم الخاصة بك لجعل هذه المقارنة ذات مغزى.)

إذا لم يكن ذلك ممكنًا ، MyEnum.values() بتخزين MyEnum.values() في صفيف ثابت.




لا يحتوي التعدادات Java على نفس النوع من تعيين التعداد إلى int الذي يقومون به في C ++.

ومع ذلك ، فإن جميع التعدادات لها طريقة values تقوم بإرجاع مجموعة من قيم التعداد الممكنة ، لذلك

MyEnum enumValue = MyEnum.values()[x];

يجب أن تعمل. إنه أمر سيئ بعض الشيء وقد يكون من الأفضل عدم محاولة التحويل من int s إلى Enum s (أو العكس) إن أمكن.




Links