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