Подтвердить что ты не робот

Эннументы и андроидная аннотация intDef

У меня есть перечисление:

public enum AppEnums {
    SERVICE_ERROR,
    CONNECTION_ERROR;
}

и я хочу использовать его в intDef аннотации Android:

@IntDef({AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
public @interface ServiceErrors {
}

показывает ошибку:

несовместимые типы найдены, требуется: 'long'

Что я могу сделать с этой несовместимостью?

Я не хочу вручную обрабатывать значения параметров AppEnum, Enum автоматически создает значения. AppEnums.CONNECTION_ERROR.ordinal() возвращает значение int параметра enum, но не работает здесь.

4b9b3361

Ответ 1

Основная идея аннотации IntDef заключается в использовании набора констант 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;
}

Вы можете увидеть подробный пример здесь.

Ответ 2

Ну, ты не можешь так поступать. 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 - новая версия Enums для Android. Для перечислений часто требуется более чем вдвое больше памяти, чем статические константы. Вы должны строго избегать использования перечислений на Android. поэтому IntDef, где предназначен для замены Enums, вы не можете использовать Enum в объявлениях IntDef

Ответ 3

@Retention(RetentionPolicy.SOURCE)
@IntDef({NOT_STARTED, PENDING, COMPLETED})
public @interface DownloadState {
    int NOT_STARTED = 1;
    int PENDING = 2;
    int COMPLETED = 3;
}

Ответ 4

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

ПРИМЕЧАНИЕ. Если для атрибута IntDef # flag() установлено значение true, можно объединить несколько констант.

@IntDef(flag = false,value = {AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
@Retention(RetentionPolicy.SOURCE)
public @interface AppEnums {

  int CONNECTION_ERROR = 0;
  int SERVICE_ERROR = 1;
}

ПРИМЕЧАНИЕ. Если для атрибута IntDef # flag() установлено значение true, можно объединить несколько констант.

Также вы можете использовать @LongDef для длинных значений и @StringDef для StringValues