Перечисления и Android аннотации intDef
у меня есть перечислимый:
public enum AppEnums {
SERVICE_ERROR,
CONNECTION_ERROR;
}
и я хочу использовать его в intDef аннотации Android:
@IntDef({AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
public @interface ServiceErrors {
}
выдает ошибку:
найдены несовместимые типы, требуется: 'long'
что я могу сделать с этой несовместимостью?
Я не хочу обрабатывать значения параметров AppEnum вручную, перечисление создает значения автоматически обычно. AppEnums.CONNECTION_ERROR.ordinal() возвращает значение int параметра enum, но не работает здесь.
3 ответов
основная идея IntDef аннотация должна использовать set of int константы как enum, а без enum. В этом случае вы должны объявить все константы вручную.
@IntDef({Status.IDLE, Status.PROCESSING, Status.DONE, Status.CANCELLED})
@Retention(RetentionPolicy.SOURCE)
@interface Status {
int IDLE = 0;
int PROCESSING = 1;
int DONE = 2;
int CANCELLED = 3;
}
вы можете посмотреть подробный пример здесь.
Ну, вы не можете сделать это таким образом. AppEnums.SERVICE_ERROR никогда не вернется int; он вернется AppEnums.SERVICE_ERROR. В этом суть перечисленных типов.
Я могу предложить следующее:
public static class AppEnums {
public static final int CONNECTION_ERROR = 0;
public static final int SERVICE_ERROR = 1;
}
@IntDef({AppEnums.CONNECTION_ERROR,AppEnums.SERVICE_ERROR})
public @interface ServiceErrors {
}
скопировал из комментария Yazazzello ниже:
IntDef - новые перечисления для разработки Android. перечисления часто требуют более чем в два раза больше памяти, чем статические константы. Вы должны строго избегать использования перечислений на Android. так что
IntDefгде предназначен для замены перечислений, вы не можете использоватьEnumнаIntDefдекларации
@Retention(RetentionPolicy.SOURCE)
@IntDef({NOT_STARTED, PENDING, COMPLETED})
public @interface DownloadState {
int NOT_STARTED = 1;
int PENDING = 2;
int COMPLETED = 3;
}