#java
Есть такой enum: public enum AlbumPrivacy { public_(0), friendsOnly(1), familyOnly(2), friendsAndFamily(3), private_(4); private final int _value; private static AlbumPrivacy[] _values; private AlbumPrivacy(int value) { _value = value; } public int getValue() { return _value; } public static AlbumPrivacy fromInt(int i) { if (_values == null) _values = AlbumPrivacy.values(); for (AlbumPrivacy b : _values) { if (b.getValue() == i) { return b; } } return null; } } Зачем такое нагородил? Удобно, когда пишешь в базу - быстро сохранять в int и назад. Но очень не удобно для каждого нового enum писать копию кода. А извернуться и убрать эту дубликацию кода нельзя? И второй вопрос - правильно ли я сделал, что храню список values, а не каждый раз дёргаю при вызове fromInt? UPD: Может тогда вот так сделать: public class EnumUtils { private static Map, Object[]> _enums; @SuppressWarnings("unchecked") public static > T fromInt(Class clazz, int index) { if (_enums == null) _enums = U2.map(); Object[] values = _enums.get(clazz); if (values == null) { Enum [] _values = clazz.getEnumConstants(); values = new Object[_values.length]; for (int i = 0; i < _values.length; i++) values[i] = _values[i]; _enums.put(clazz, values); } return (T) values[index]; } } А enum объявлять по простому, без всяких номеров. UPD2: public static > T fromInt(Class clazz, int index) { return clazz.getEnumConstants()[index]; }
Ответы
Ответ 1
У каждого enum и так есть порядковое значение поля — метод ordinal(). Если у вас все value идут по порядку, посто делайте public enum AlbumPrivacy { public_, // 0 friendsOnly, // 1 familyOnly, // 2 friendsAndFamily, // 3 private_; // 4 } Для определения номера по enum: int n = AlbumPrivacy.friendsOnly.ordinal(); Для определения enum по номеру: AlbumPrivacy value = AlbumPrivacy.values()[3]; Если вас это не устраивает (скажем, номера могут идти с дырками), можно во-первых, реализовать интерфейс, а во-вторых сделать метод fromInt универсальным. interface Ordinal { int getValue(); } public enum AlbumPrivacy implements Ordinal { public_(0), friendsOnly(1), familyOnly(2), friendsAndFamily(3), private_(4); private final int _value; private AlbumPrivacy(int value) { _value = value; } @Override public int getValue() { return _value; } } // Где-нибудь в утилитном классе: public static& Ordinal> T fromInt(Class clazz, int i) { T[] values = clazz.getEnumConstants(); for(T value : values) { if(value.getValue() == i) return value; } throw new IllegalArgumentException(); } Ответ 2
Отвечаю на вторую часть вопроса. Нет, вы неправильно делаете, что запоминаете values. Метод getEnumConstants уже запоминает результат, нет никакой необходимости запоминать его еще раз.
Комментариев нет:
Отправить комментарий