Если ваше перечисление вписывается в int (то есть <= 32 значения), я бы развернул собственную реализацию, используя порядковый номер каждого перечисления; например, </p>
public <E extends Enum<E>> int encode(EnumSet<E> set) {
int ret = 0;
for (E val : set) {
// Bitwise-OR each ordinal value together to encode as single int.
ret |= (1 << val.ordinal());
}
return ret;
}
public <E extends Enum<E>> EnumSet<E> decode(int encoded, Class<E> enumKlazz) {
// First populate a look-up map of ordinal to Enum value.
// This is fairly disgusting: Anyone know of a better approach?
Map<Integer, E> ordinalMap = new HashMap<Integer, E>();
for (E val : EnumSet.allOf(enumKlazz)) {
ordinalMap.put(val.ordinal(), val);
}
EnumSet<E> ret= EnumSet.noneOf(enumKlazz);
int ordinal = 0;
// Now loop over encoded value by analysing each bit independently.
// If the bit is set, determine which ordinal that corresponds to
// (by also maintaining an ordinal counter) and use this to retrieve
// the correct value from the look-up map.
for (int i=1; i!=0; i <<= 1) {
if ((i & encoded) != 0) {
ret.add(ordinalMap.get(ordinal));
}
++ordinal;
}
return ret;
}
Отказ от ответственности : я не проверял это!
EDIT
Как Томас упоминает в комментариях, порядковые номера нестабильны в том смысле, что любое изменение вашего определения enum в вашем коде приведет к повреждению кодировок в вашей базе данных (например, если вы вставите новое значение enum в середину вашего существующего определения) , Мой подход к решению этой проблемы заключается в определении таблицы «Enum» для каждого перечисления, содержащей числовой идентификатор ( не порядковый номер ) и значение перечисления String. Когда мое приложение Java запускается, первое, что делает слой DAO, - это читает каждую таблицу Enum в память и:
- Убедитесь, что все значения перечисления String в базе данных соответствуют определению Java.
- Инициализировать двунаправленную карту идентификатора для перечисления и наоборот, которую я затем использую всякий раз, когда сохраняю перечисление (Другими словами, все таблицы «данных» ссылаются на специфичный для базы данных идентификатор перечисления, а не хранят строку значение явно).
Это намного чище / надежнее ИМХО, чем порядковый подход, который я описал выше.