У меня есть вход в качестве roleID (типа данных Long), поэтому я не могу использовать регистр переключения, я использую операторы if else прямо сейчас. Я ищу решение, но не нашел идеального.

RoleEnum fetchProcessForRole(roleID) {
    if (RoleEnum.USER.equals(roleID) {
        return RoleEnum.USER_VALIDATION; // this is of int type
    } else if (RoleEnum.ADMIN.equals(roleID) {
        return RoleEnum.ADMIN_VALIDATION;
    } else if (RoleEnum.MGR.equals(roleID) {
        return RoleEnum.MGR_VALIDATION;
    }
}

RoleEnum {
    USER(1,"USER","userrpt"),
    ADMIN(2,"ADMIN","adminrpt"),
    MGR(3,"MGR","mgrrpt"),
    USER_VALIDATION(4,"USER_VALIDATION","userrpt"),
    ADMIN_VALIDATION(5,"ADMIN_VALIDATION","adminrpt"),
    MGR_VALIDATION(6,"MGR_VALIDATION","mgrrpt");
    // it have int id, String name and its getters
}

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

1
Kamini 30 Май 2020 в 22:45

5 ответов

Лучший ответ

Вы можете получить enum используя roleId

RoleEnum role =
        EnumSet.allOf(RoleEnum.class).stream().filter(r -> r.getId() == roleId).findFirst().orElseThrow();

Затем используйте switch-case, чтобы получить результат без необходимости преобразования.

RoleEnum result;
switch (role) {
  case USER :
    result = RoleEnum.USER_VALIDATION;
    break;
  case ADMIN :
    result = RoleEnum.ADMIN_VALIDATION;
    break;
  case MGR :
    result = RoleEnum.MGR_VALIDATION;
    break;
  default:
    result = null;
 }
1
User - Upvote don't say Thanks 31 Май 2020 в 11:22

Итак, пара вещей, чтобы отметить. Как выглядит метод equum для enum, если вы его переопределили. Это простая проверка, чтобы увидеть, равен ли roleId идентификатору enums:

public boolean equals(long roleId) {
   return (int) roleId == id
}

Но я думаю, что лучший способ подойти к этому - использовать карту:

HashMap<int, RoleEnum> validation = new HashMap<int, RoleEnum>();

RoleEnum fetchProcessForRole(long roleId){
   return validation.get((int) roleId);
}
0
Major Ben 30 Май 2020 в 20:30

Привет, я получил ниже решение по этому вопросу.

RoleEnum fetchProcessForRole(Long roleID) {

String name= RoleEnum.values()[int(long)roleID].getName().toUpperCase();
return EnumSet.allOf(RoleEnum.class).stream()
            .filter(role -> role.getName().startsWith(name+"_"))
            .findFirst()
            .get();

}
0
Kamini 31 Май 2020 в 12:01

Я не уверен, что RoleEnum находится под вашим контролем или нет.

Но я не понимаю, что представляет

  1. Роль пользователя
  2. Требуется проверка для роли пользователя
  3. И то и другое

Я думаю, что это представляет вариант 3, возможно, требуется в вашем случае использования. Но у этого есть больше чем одна причина, чтобы измениться. Пожалуйста, рассмотрите возможность их разделения.

Если вы это сделаете, ваша функция изменится на принятие RoleEnum и возврат RoleValidationEnum.

Вы можете использовать switch, чтобы решить, какие RoleEnum какие возвращают RoleValidationEnum.

Надеюсь, это поможет.

0
Amar Dev 31 Май 2020 в 11:07

Если вам не разрешено трогать RoleEnum, и у вас есть тесты, чтобы доказать, что порядок перечислений никогда не меняется, и другой набор тестов, чтобы доказать, что идентификаторы находятся в порядке возрастания от 1, то вы могли бы сделать такой мерзость:

RoleEnum fetchProcessForRole(long roleID) {
    RoleEnum[] values = RoleEnum.values();
    if (roleID < 1 || roleID > values.length) {
        throw new IllegalArgumentException("Role id not found");
    }
    return values[(int) roleID - 1];
}

Но вы действительно должны просто хранить все это в карте id: enum.

0
pafau k. 30 Май 2020 в 20:29