Поскольку я не получил ответ на свой вопрос, по которому вопрос является более эффективным, я решил провести собственное тестирование.
Я проверял итерацию по values()
, Arrays.asList( values() )
и EnumSet.allOf( )
.
Я повторил эти тесты 10000000 раз для разных размеров перечислений. Вот результаты теста:
oneValueEnum_testValues 1.328
oneValueEnum_testList 1.687
oneValueEnum_testEnumSet 0.578
TwoValuesEnum_testValues 1.360
TwoValuesEnum_testList 1.906
TwoValuesEnum_testEnumSet 0.797
ThreeValuesEnum_testValues 1.343
ThreeValuesEnum_testList 2.141
ThreeValuesEnum_testEnumSet 1.000
FourValuesEnum_testValues 1.375
FourValuesEnum_testList 2.359
FourValuesEnum_testEnumSet 1.219
TenValuesEnum_testValues 1.453
TenValuesEnum_testList 3.531
TenValuesEnum_testEnumSet 2.485
TwentyValuesEnum_testValues 1.656
TwentyValuesEnum_testList 5.578
TwentyValuesEnum_testEnumSet 4.750
FortyValuesEnum_testValues 2.016
FortyValuesEnum_testList 9.703
FortyValuesEnum_testEnumSet 9.266
Это результаты для тестов, запускаемых из командной строки. Когда я запускал эти тесты из Eclipse, я получил подавляющую поддержку testValues
. В основном это было меньше, чем EnumSet
даже для небольших перечислений. Я считаю, что выигрыш в производительности достигается за счет оптимизации итератора массива в цикле for ( val : array )
.
С другой стороны, как только вам понадобится java.util.Collection для передачи, Arrays.asList( )
теряет значение до EnumSet.allOf
, особенно для небольших перечислений, которые, я считаю, будут большинством в любой заданной кодовой базе.
Итак, я бы сказал, что вы должны использовать
for ( final MyEnum val: MyEnum.values( ) )
но
Iterables.filter(
EnumSet.allOf( MyEnum.class ),
new Predicate< MyEnum >( ) {...}
)
И использовать только Arrays.asList( MyEnum.values( ) )
, где java.util.List
абсолютно необходимо.