Перечисления и 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;
}