web-dev-qa-db-fra.com

Enums et annotation Android intDef

J'ai un enum:

public enum AppEnums {
    SERVICE_ERROR,
    CONNECTION_ERROR;
}

et je veux l'utiliser dans un intDef d'annotation Android:

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

erreur montre:

types incompatibles trouvés, obligatoires: 'long'

Que puis-je faire avec cette incompatibilité?

Je ne veux pas gérer les valeurs des paramètres AppEnum manuellement, Enum crée automatiquement des valeurs. AppEnums.CONNECTION_ERROR.ordinal() renvoie la valeur int du paramètre enum mais ne fonctionne pas ici.

32
AliSh

L'idée principale de l'annotation IntDef est d'utiliser un ensemble de constantes int comme un enum, mais sansenum. Dans ce cas, vous devez déclarer toutes les constantes manuellement.

@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;
}

Vous pouvez voir un exemple détaillé ici .

42
Oleksii K.

Eh bien, vous ne pouvez pas le faire de cette façon. AppEnums.SERVICE_ERROR ne retournera jamais int; il retournera AppEnums.SERVICE_ERROR. C'est le point des types énumérés.

Ce que je peux suggérer est ceci:

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 {
}

Copié du commentaire de Yazazzello ci-dessous:

IntDef - nouvel Enums pour le développement Android. Les enums nécessitent souvent plus de deux fois plus de mémoire que les constantes statiques. Vous devriez strictement éviter d'utiliser des enums sur Android . alors IntDef où conçu pour remplacer Enum, vous ne pouvez pas utiliser Enum dans les déclarations IntDef

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