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.
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 .
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 utiliserEnum
dans les déclarationsIntDef
@Retention(RetentionPolicy.SOURCE)
@IntDef({NOT_STARTED, PENDING, COMPLETED})
public @interface DownloadState {
int NOT_STARTED = 1;
int PENDING = 2;
int COMPLETED = 3;
}