Отображение между перечислением и строкой? - PullRequest
1 голос
/ 03 января 2012

Итак, я недавно прочитал этот пост и хочу эффективно сделать то же самое.

Меня не очень волновало "безобразие" и т. Д., Поэтому я реализовал один изметоды, подобные следующим:

public enum Day {

    Monday(1), 
    Tuesday(2), 
    Wednesday(3), 
    Thursday(4), 
    Friday(5), 
    Saturday(6), 
    Sunday(7);

    public final int id;

    Day(int id) {
        this.id = id;
    }

    public static Day getByID(int id) {
        Day d = null;
        for (Day dTemp : Day.values())
        {
            if (id == dTemp)
            {
                d = dTemp;
                break;
            }
        }

        return d;
    }

    public Day getNext() {
        return values()[(ordinal()+1)%values().length];
    }

    public Day getPrev() {
        return values()[(ordinal()-1)%values().length];
    }
}

Но проблема в том, что когда я это делаю, в операторе if:

if (id == dTemp)

Он говорит, что это несовместимые типы.Что я должен сделать, чтобы это исправить?

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Используйте if ( id == dTemp.id ). Перечисления являются классами, а значения перечислений являются объектами, а не целыми, и поэтому не могут быть преобразованы (ни явным, ни неявным образом) в int.

В качестве альтернативы обратите внимание, что перечисления имеют порядковый номер, то есть идентификатор их положения. В вашем примере Monday будет иметь порядковый номер 0, а Sunday будет иметь порядковый номер 6. Вы получаете доступ к порядковому номеру, вызывая метод ordinal().

Таким образом, если id основано на одном, вы можете сделать следующее:

public static Day getByID(int id) {   
  //check id is between 1 and 7, I'll leave that for you
  return Day.values()[id - 1];
}

Обратите внимание, что вы можете кэшировать Day.values() в приватной статической переменной и затем обращаться к этому кешированному массиву.

Кстати, где строка, которую вы упоминаете в своем вопросе?

1 голос
/ 03 января 2012
if(id == dTemp.id)

Должно работать.


В качестве альтернативы попробуйте метод ordinal() enum.

public final int ordinal () Возвращает порядковый номерэта константа перечисления (ее позиция в объявлении перечисления, где начальная константа имеет порядковый номер, равный нулю).Большинство программистов не будут использовать этот метод.Он предназначен для использования сложными структурами данных на основе перечислений, такими как EnumSet и EnumMap.

Возвращает: порядковый номер этой константы перечисления. См. .


Ну, я скопировал ваш код и проверил соответственно.

Оба

if (id == dTemp.ordinal()+1)

и

if(id == dTemp.id)

работали нормально и производились, как и ожидалось.Оператор

System.out.println(Day.Friday.getByID(1));

производит понедельник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...