Сохранение целочисленных значений в качестве констант в режиме Enum в java
В настоящее время я создаю целочисленные константы следующим образом.
public class Constants {
public static int SIGN_CREATE=0;
public static int SIGN_CREATE=1;
public static int HOME_SCREEN=2;
public static int REGISTER_SCREEN=3;
}
Когда я пытаюсь сделать это с помощью перечисления
public enum PAGE{SIGN_CREATE,SIGN_CREATE,HOME_SCREEN,REGISTER_SCREEN}
и Когда я использовал PAGE.SIGN_CREATE
, он должен вернуть 1;
Ответы
Ответ 1
Ну, ты не можешь так поступать. PAGE.SIGN_CREATE
никогда не вернет 1; он вернет PAGE.SIGN_CREATE
. Это точка перечисляемых типов.
Однако, если вы хотите добавить несколько нажатий клавиш, вы можете добавить поля в свои перечисления, например:
public enum PAGE{
SIGN_CREATE(0),
SIGN_CREATE_BONUS(1),
HOME_SCREEN(2),
REGISTER_SCREEN(3);
private final int value;
PAGE(final int newValue) {
value = newValue;
}
public int getValue() { return value; }
}
И затем вы вызываете PAGE.SIGN_CREATE.getValue()
, чтобы получить 0.
Ответ 2
Наиболее распространенной действительной причиной необходимости целочисленной константы, связанной с каждым значением перечисления, является взаимодействие с каким-либо другим компонентом, который все еще ожидает эти целые числа (например, протокол сериализации, который вы не можете изменить, или перечисления представляют столбцы в таблице, и т.д.).
В почти всех случаях я предлагаю использовать EnumMap
. Он полностью отделяет компоненты, если это вызывает беспокойство, или если перечисления представляют индексы столбцов или что-то подобное, вы можете легко внести изменения позже (или даже во время выполнения, если это необходимо).
private final EnumMap<Page, Integer> pageIndexes = new EnumMap<Page, Integer>(Page.class);
pageIndexes.put(Page.SIGN_CREATE, 1);
//etc., ...
int createIndex = pageIndexes.get(Page.SIGN_CREATE);
Он также невероятно эффективен.
Добавление таких данных в экземпляр enum может быть очень мощным, но чаще всего это злоупотребление.
Изменить: Только что понял, что Блох обратился к этому в "Эффективном Java/2nd edition" в . Пункт 33: используйте EnumMap
вместо порядкового индексации.
Ответ 3
Вы можете использовать ordinal. Поэтому PAGE.SIGN_CREATE.ordinal()
возвращает 1
.
EDIT:
Единственная проблема с этим заключается в том, что если вы добавите, удалите или измените порядок значений перечисления, вы сломаете систему. Для многих это не проблема, поскольку они не будут удалять перечисления и будут добавлять только дополнительные значения до конца. Это также не хуже целых констант, которые также требуют, чтобы вы не перенумеровали их. Однако лучше всего использовать такую систему, как:
public enum PAGE{
SIGN_CREATE0(0), SIGN_CREATE(1) ,HOME_SCREEN(2), REGISTER_SCREEN(3)
private int id;
PAGE(int id){
this.id = id;
}
public int getID(){
return id;
}
}
Затем вы можете использовать getID
. Итак PAGE.SIGN_CREATE.getID()
возвращает 1
.
Ответ 4
Вы можете сохранить это значение const в перечислении так. Но зачем даже использовать const? Вы продолжаете перечисление?
public class SO3990319 {
public static enum PAGE {
SIGN_CREATE(1);
private final int constValue;
private PAGE(int constValue) {
this.constValue = constValue;
}
public int constValue() {
return constValue;
}
}
public static void main(String[] args) {
System.out.println("Name: " + PAGE.SIGN_CREATE.name());
System.out.println("Ordinal: " + PAGE.SIGN_CREATE.ordinal());
System.out.println("Const: " + PAGE.SIGN_CREATE.constValue());
System.out.println("Enum: " + PAGE.valueOf("SIGN_CREATE"));
}
}
Edit:
Это зависит от того, что вы используете int для использования EnumMap или поля экземпляра.
Ответ 5
если вы хотите, чтобы конвертировать integer
обратно в соответствующий enum
с выбранным значением, см. Constants.forValue(...)
в ниже автоматически сгенерированный код, но если не ответ BlairHippo - лучший способ сделайте это.
public enum Constants
{
SIGN_CREATE(0),
SIGN_CREATE(1),
HOME_SCREEN(2),
REGISTER_SCREEN(3);
public static final int SIZE = java.lang.Integer.SIZE;
private int intValue;
private static java.util.HashMap<Integer, Constants> mappings;
private static java.util.HashMap<Integer, Constants> getMappings()
{
if (mappings == null)
{
synchronized (Constants.class)
{
if (mappings == null)
{
mappings = new java.util.HashMap<Integer, Constants>();
}
}
}
return mappings;
}
private Constants(int value)
{
intValue = value;
getMappings().put(value, this);
}
public int getValue()
{
return intValue;
}
public static Constants forValue(int value)
{
return getMappings().get(value);
}
}
Ответ 6
Я нашел это полезным:
http://dan.clarke.name/2011/07/enum-in-java-with-int-conversion/
public enum Difficulty
{
EASY(0),
MEDIUM(1),
HARD(2);
/**
* Value for this difficulty
*/
public final int Value;
private Difficulty(int value)
{
Value = value;
}
// Mapping difficulty to difficulty id
private static final Map<Integer, Difficulty> _map = new HashMap<Integer, Difficulty>();
static
{
for (Difficulty difficulty : Difficulty.values())
_map.put(difficulty.Value, difficulty);
}
/**
* Get difficulty from value
* @param value Value
* @return Difficulty
*/
public static Difficulty from(int value)
{
return _map.get(value);
}
}