Проблема с Switch Case, использующим строковые константы, инициализированные из Enum - PullRequest
0 голосов
/ 29 августа 2018

В моем коде есть регистр переключателя, в котором регистры определены в строковых константах.
Если я инициализирую строковые константы как

String INACTIVE = "INACTIVE";  

Корпус переключателя работает нормально.

Однако, если я инициализирую строковые константы, используя перечисление как

String INACTIVE = State.INACTIVE.name();

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

Требуется постоянное выражение

Я использую архитектуру MVP, и мой State Enum можно использовать только в Presenter, в то время как мой случай переключения находится в представлении Activity.

Я не хочу дублировать Enum в представлении, учитывая проблемы с поддержкой кода.

Это вынуждает меня определять строковые константы отдельно для моего случая переключения, но это не позволяет мне инициализировать константы, используя значения перечисления State.

Заранее благодарим за любые полезные предложения и решения.

1 Ответ

0 голосов
/ 29 августа 2018

Сделай так:

public enum State {
    INACTIVE {
        @Override
        public int getId() {
            return 0;
        }
    },
    ACTIVE {
        @Override
        public int getId() {
            return 1;
        }
    },
    CURRENT {
        @Override
        public int getId() {
            return 2;
        }
    };

    public abstract int getId();

    public State getStateById(int id) {
        if (id == 0) {
            return INACTIVE;
        } else if (id == 1) {
            return ACTIVE;
        } else if (id == 2) {
            return CURRENT;
        }
        // this should never happen
        throw new RuntimeException("Shouldn't");
    };
}

поэтому в основном вы используете идентификатор, передаваемый между Presenter и ActivityView, а затем используете сам класс enum для разрешения идентификатора и получения enum, который вы можете использовать непосредственно в случае переключения. В моем примере я использовал int только для того, чтобы показать вам все детали, но если вы полагаетесь на getName () и разрешаете строку напрямую, вам не нужно перезаписывать какой-либо метод вообще.

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