2014-11-28 5 views
0

Мне очень сложно писать статические методы, которые работают для Enums. Это действительно надуманный пример, но предположим, что вы хотите написать метод, который принимает константу Enum и возвращает следующий объявленный. Я обнаружил (примерно через час), что вы можете сделать это следующим образом. Он работает и не генерирует никаких предупреждений компилятора.статические методы, которые принимают параметры Enum

static <E extends Enum<E>> E getNextDeclared(E e) { 
    int ordinal = e.ordinal(); 
    for (Object object : EnumSet.allOf(e.getClass())) { 
     if (e.getClass().cast(object).ordinal() == ordinal + 1) { 
      return e.getDeclaringClass().cast(object); 
     } 
    } 
    throw new IllegalArgumentException(); 
} 

Я что-то не хватает? Можете ли вы сделать это без бросков? Есть ли способ упростить это, не создавая нагрузки на предупреждения? Кроме того, что подходит для записи вместо Object?

+0

Ну, e.getClass(). GetEnumConstants [e.ordinal() + 1] будет проще ... –

+1

@LouisWasserman Я думаю, что это должно быть 'e.getDeclaringClass(). GetEnumConstants() [e.ordinal () + 1]; ' – Jesper

+0

Да, хороший улов. –

ответ

1

Как это:

static <E extends Enum<E>> E getNextDeclared(E e) { 
    int ordinal = e.ordinal(); 
    for (E object : EnumSet.allOf(e.getDeclaringClass())) { 
     if (object.ordinal() == ordinal + 1) { 
      return object; 
     } 
    } 
    throw new IllegalArgumentException(); 
} 

или с тем, что говорит Луи Вассерман:

static <E extends Enum<E>> E getNextDeclared(E e) { 
    return e.getDeclaringClass().getEnumConstants()[e.ordinal() + 1]; 
} 

(хотя это было бы бросить ArrayIndexOutOfBoundsException вместо IllegalArgumentException если вы идете слишком высоко).

Смежные вопросы