2015-04-03 4 views
3

Я использую данные из веб-службы, будет хранить эти данные в классах держателей данных, а затем получать их в другом месте.java enum getter setter

Для конкретной области, наиболее подходящий тип данных перечислимого типа и, следовательно, я создал следующее перечисление:

public enum EventStatus { 
    PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE(
      6), ACTION_REQUESTED_FROM_POLICE_STATION(7), ACTION_REQUESTED_FROMD_ISPATCHER(
      8), ACTION_REQUESTED_FROM_SUPERVISOR(9); 
    private int value; 

    private EventStatus(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
    //Just for testing from some SO answers, but no use 
    public void setValue(int value) { 
     this.value = value; 
    } 
} 

Данное перечисление используется в другом классе следующим образом:

public EventStatus getEventStatus() { 
    return eventStatus; 
} 

public void setEventStatus(EventStatus eventStatus) { 
    this.eventStatus = eventStatus; 
} 

Теперь, когда Я пытаюсь установить значение, как следующее:

event.setEventStatus(getAttributeValueInt(linkedEventElement, "status")); 

, которые приравненные к

event.setEventStatus(1); 

Я получаю ошибку компиляции, что метод не применим для аргументов (интермедиат)

Один из способов я могу сделать, это что-то вроде этого:

switch(getAttributeValueInt(linkedEventElement, "status")){ 
    case 1:eventLinkedEvent.setEventStatus(EventStatus.PENDING); 
     //and so on... 
} 

Но это разрушает единственную цель перечисления.

Также как получить значение статуса события в целочисленной форме?

Может ли кто-нибудь мне посоветовать, как идти дальше?

+0

Это плохая идея, чтобы добавить сеттер в перечисления из-за перечисления должны быть неизменны – ACV

ответ

4

Вы можете создать перечисление как этот

public enum EventStatus { 
    PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE(
      6), ACTION_REQUESTED_FROM_POLICE_STATION(7), ACTION_REQUESTED_FROMD_ISPATCHER(
      8), ACTION_REQUESTED_FROM_SUPERVISOR(9); 
    private int value; 

    private EventStatus(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
    //Just for testing from some SO answers, but no use 
    public void setValue(int value) { 
     this.value = value; 
    } 

    public static EventStatus getEventStatusById(int id) { 

     EventStatus event = null; 

     switch (id) { 
     case 1: 
      event = PENDING; 
      break; 
     case 2: 
      event = OPEN; 
      break; 
     case 3: 
      event = DISPATCHED; 
      break; 
     case 4: 
      event = APPENDED; 
      break; 
     case 5: 
      event = CLOSED; 
      break; 
     case 6: 
      event = REQUESTED_TO_CLOSE; 
      break; 
     case 7: 
      event = ACTION_REQUESTED_FROM_POLICE_STATION; 
      break; 
     case 8: 
      event = ACTION_REQUESTED_FROMD_ISPATCHER; 
      break; 
     case 9: 
      event = ACTION_REQUESTED_FROM_SUPERVISOR; 
      break; 

     default: 
      break; 
     } 
     return event; 
    } 
} 

после того, как вы можете попробовать ниже линии, чтобы установить EventStatus

event.setEventStatus(EventStatus.getEventStatusById(getAttributeValueInt(linkedEventElement, "status"))); 

Я думаю, что его полезно ..

+0

Это сработало. Просто * getEventStatusById * должен быть статичным. – GAMA

+0

да, вы правы. Это моя ошибка, чтобы забыть set static для метода getEventStatusById. –

+0

Ваш код работает нормально, но что бы вы сделали с аналогичным требованием, где, например, 100 значений перечисления. Это похоже на большой случай переключения. Мы можем использовать 'values ​​()' класса Enum' для эффективного сокращения ручной работы. Посмотрите на мой ответ ниже для более подробной информации :) –

2

Создайте отображение в перечислении себя от значения до константы перечисления. И затем метод static, который принимает тип int и возвращает тип enum.

public enum EventStatus { 
    // constants 
    ; 
    private final static Map<Integer, EventStatus> REVERSE_MAP = new HashMap<>(); 

    static { 
     for (EventStatus status: values()) { 
      REVERSE_MAP.put(status.value, status); 
     } 
    } 

    public static EventStatus forValue(int value) { 
     return REVERSE_MAP.get(value); 
    } 
} 
+0

КАК Я УСТАНАВЛИВАЮТ ТОЛЬКО ЗНАЧЕНИЕ? – GAMA

+0

@GAMA .. Кажется, что вам нравится ALL_CAPS немного слишком много. Кстати, что значит установить значение сейчас? Просто вызовите этот метод 'static', передавая значение' int'. –

+0

используйте метод forValue: 'event.setEventStatus (EventStatus.forValue (getAttributeValueInt (linkedEventElement," status ")));' (я предполагаю, что это ваш вопрос). Это лучший ответ здесь, если вы хотите, чтобы он был быстрым и надежным, чтобы развиваться. –

1

Перечисление - это класс. Это не простой псевдоним для int, как в C, например. 1 является целым числом, а не экземпляром EventStatus, и ваш метод ожидает экземпляр EventStatus, поэтому он не компилируется.

Просто обеспечить фабричный метод в перечислении преобразовать целочисленное значение для перечисления:

public static EventStatus fromIntValue(int value) { 
    // iterate through the enum constants, returned by EventStatus.value(), 
    // and find the one with the given value 
} 

Вы также можете хранить константы перечислений в Map<Integer, EventStatus> сделать поисковую O (1).

+0

Что-то вроде этого ??? \t if (value == EventStatus.PENDING.getValue()) \t \t \t return EventStatus.PENDING; \t \t else if (value == EventStatus.OPEN.getValue()) \t \t \t return EventStatus.OPEN; – GAMA

+0

№. Просто используйте цикл: 'for (EventStatus es: EventStatus.value()) {if (es.getValue() == value) {return es; } ' –

+0

Хорошо, спасибо .. – GAMA

1

Быстрое решение, так как ваши порядковые (Enum индексы) соответствуют вашим ценностям (с разницей в 1), измените Enum EventStatus включить новый массив из EventStatus: -

public enum EventStatus { 
    PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE(
      6), ACTION_REQUESTED_FROM_POLICE_STATION(7), ACTION_REQUESTED_FROMD_ISPATCHER(
      8), ACTION_REQUESTED_FROM_SUPERVISOR(9); 
    private int value; 

    public static final EventStatus values[] = values(); 

    private EventStatus(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
    //Just for testing from some SO answers, but no use 
    public void setValue(int value) { 
     this.value = value; 
    } 
} 

Теперь вместо этого: -

event.setEventStatus(getAttributeValueInt(linkedEventElement, "status")); 

Используйте это: -

event.setEventStatus(EventStatus.values[(getAttributeValueInt(linkedEventElement,"status"))-1)]); 

Это вернет E значение Num для соответствующих порядкового значения, например: -

EventStatus.values[1-1]; //this will return EnumStatus.PENDING 

-1 потому, что вы предоставили свои порядковые значения, начиная с 1.