Сравните строку со значением перечисления, используя переключатель в Java - PullRequest
1 голос
/ 27 сентября 2019

Примечание: это не дубликат оператора переключения Java: требуется постоянное выражение, но оно является константой , потому что решение этой ссылки уже применено здесь.


Inприложение Cordova с машинописью Я использую это перечисление для отправки своих действий =

машинопись

enum PluginActions {
   PICK = "PICK",
   PICK_MULTIPLE = "PICK_MULTIPLE"
}

Я отправляю это в Cordova, и в Java я получаю это как строковую переменную action в моемметод.

@Override
  public boolean execute(String action, JSONArray inputs, CallbackContext callbackContext) throws JSONException {

  }

Там у меня также есть перечисление.

Java

enum PickerActions {
  PICK, PICK_MULTIPLE
}

Я хочу сравнить машинопись PluginActions с Java PickerActions.

Использование if Я могу сделать это с помощью:

if (action.equals(PickerActions.PICK.name())) { }

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

  switch (action) {
    case PickerActions.PICK.name():
      JSONObject filters = inputs.optJSONObject(0);
      this.chooseFile(filters, callbackContext);
      return true;
    default:
    Log.w(this.LOGGER_TAG, "No function was found for " + action);
    return false;      
  }

Но я получаю там ошибку: error: constant string expression required

Есть ли способ использовать имя строки перечисления в операторе switch?

Редактировать:

Какв соответствии с рекомендацией @Arnaud я привел значение enum следующим образом:

final PickerActions pickerAction = FilePickerActions.valueOf(action);

    switch (pickerAction ) {
      case PickerActions.PICK:
        JSONObject filters = inputs.optJSONObject(0);
        this.chooseFile(filters, callbackContext);
        return true;
      default:
      Log.w(this.LOGGER_TAG, "No function was found for " + action);
      return false;      
    }

Но я получаю еще одну ошибку, касающуюся ошибки case PickerAction.Pick

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

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

ошибка: метка регистра переключателя перечисления должна быть безусловным именем константы перечисления. Вы не должны использовать case PickerActions.PICK, а использовать только регистр PICK, как показано ниже,

public class MainClass {
   enum Choice { Choice1, Choice2, Choice3 }
   public static void main(String[] args) {
      Choice ch = Choice.Choice1;

      switch(ch) {
         case Choice1:
            System.out.println("Choice1 selected");
            break;
         case Choice2:
            System.out.println("Choice2 selected");
            break;
         case Choice3:
            System.out.println("Choice3 selected");
             break;
      }
   }
}
2 голосов
/ 27 сентября 2019

Я предлагаю использовать строковые значения для вашего перечисления Java:

private enum PickerActions {
    PICK("PICK"),
    PICK_MULTIPLE("PICK_MULTIPLE");
    private final String value;
    PickerActions(final String value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return value;
    }
}

private static boolean test(String test) {
     switch (PickerActions.valueOf(test)) {
        case PICK:
            //
            return true;
        case PICK_MULTIPLE:
            //
            return false;
        default:
            // Log.w(this.LOGGER_TAG, "No function was found for " + test);
            return false;      
    }
}

Вот рабочий пример

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