Допустим, у нас есть один класс, который выглядит так:
public class UserAction {
static final int ACTION_USER_WANTS_TO_DO_A = 1001;
static final int ACTION_USER_WANTS_TO_DO_B = 1002;
// ...
// 'sub-grouping'
static final int[] ALL_ACTIONS_ALLOWED_IN_STATE_X = {
ACTION_USER_WANTS_TO_DO_A,
ACTION_USER_WANTS_TO_DO_D,
ACTION_USER_WANTS_TO_DO_Q,
// ...
}
}
... и другой класс, который выглядит так:
public class Model {
public void onActionableEvent(int action) {
// check for state mismatch by iterating over sub-groups
// if (fail) {return;}, if pass:
Log.i("XXX","processing: " + action); // <----- this is the problem.
switch (action) {
case: .ACTION_USER_WANTS_TO_DO_A: {
//
break;
}
case: .ACTION_USER_WANTS_TO_DO_B: {
//
break;
}
}
}
}
У меня проблемы с записью действительного имени действий вместо необработанного int... без выполнения целой связки неэффективного кода - например. регистрация необработанных строк в каждом блоке отдельно, с использованием Hashmap, где рефакторинг имен станет громоздким.
Мой вопрос: какую структуру данных можно использовать, чтобы:
1) Разрешить 'UserActions' быть подгруппированными, как они есть в классе UserAction - таким образом, что подгруппа может быть перебрана. (Это исключает Enum, например).
2) Будет ли отображаться фактическое имя действия в журнале (например,.toString()) вместо того, чтобы просто показывать фактическое значение int (число)? (кажется, исключаю int... это то, что я использую).
3) Может использоваться статически, как в примере, без необходимости создания экземпляра UserAction.
Я бы сказал, что enum - это то, что вам нужно. Что-то вроде этого:
enum USER_ACTIONS { ACTION_USER_WANTS_TO_DO_A, ACTION_USER_WANTS_TO_DO_B };
И пытаюсь ответить на ваши 3 вопроса:
1) они сгруппированы в перечислении
2) в журнале вы получите обработку: ACTION_USER_WANTS_TO_DO_A
3) да