24

Ho un enum:enumerazioni e annotazione Android intDef

public enum AppEnums { 
    SERVICE_ERROR, 
    CONNECTION_ERROR; 
} 

e voglio usarlo in un intDef di Android della nota:

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

di errore mostra:

incompatibili tipi trovati, richiesti: 'long'

Cosa posso fare con questa incompatibilità?

Non voglio gestire manualmente i valori dei parametri AppEnum, Enum crea automaticamente i valori in modo normale. AppEnums.CONNECTION_ERROR.ordinal() restituisce il valore int del parametro enum ma non funziona qui.

+1

Beh, non puoi proprio farlo in quel modo. AppEnums .SERVICE_ERROR non restituirà mai int; restituirà AppEnums .SERVICE_ERROR. Questo è il punto dei tipi enumerati. – Bhargav

+4

'@ IntDef' funziona solo con numero intero. Se vuoi lavorare con un Enum non hai bisogno di '@ IntDef'. Basta usare l'Enum come parametro. –

+0

Non si dovrebbe mai fare affidamento sul valore ordinale delle costanti di enum, dal momento che la modifica dell'ordine delle costanti interromperà in modo sottile il codice, il peggior tipo di rottura. –

risposta

8

Beh, non puoi proprio farlo in questo modo. AppEnums.SERVICE_ERROR non restituirà mai int; restituirà AppEnums.SERVICE_ERROR. Questo è il punto dei tipi enumerati.

Quello che posso suggerire è questo:

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

copiati dal commento di Yazazzello di seguito:

IntDef - nuove enumerazioni per lo sviluppo Android. Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android. così IntDef dove progettato per sostituire enumerazioni, non è possibile utilizzare Enum in IntDef dichiarazioni

+0

Non voglio gestire manualmente i valori dei parametri AppEnum, Enum crea automaticamente i valori automaticamente. – AliSh

+1

sì, ma non sono considerati valori costanti, è possibile utilizzare il metodo ordinal() per Enum e assegnarlo ad alcuni campi costanti e utilizzare quei campi costanti nell'annotazione IntDef – Bhargav

+4

IntDef - new Enums per lo sviluppo Android. [Le enumerazioni spesso richiedono più del doppio della memoria delle costanti statiche. Dovresti assolutamente evitare l'uso di enumerazioni su Android.] (Https://developer.android.com/training/articles/memory.html#Overhead) quindi IntDef, dove è progettato per sostituire Enums, non puoi usare Enum nelle dichiarazioni IntDef – Yazazzello

26

L'idea principale di IntDef annotazione è quello di utilizzare un insieme di int costanti come un enum, ma senzaenum. In questo caso devi dichiarare tutte le costanti manualmente.

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

È possibile vedere l'esempio dettagliata here.

+0

Non voglio gestire manualmente i valori dei parametri AppEnum, Enum crea automaticamente i valori in modo normale. AppEnums.CONNECTION_ERROR.ordinal() restituisce il valore int del parametro enum ma non funziona qui. – AliSh

+2

Bene, allora intdef non fa per te. Il punto di intdef è rimuovere il sovraccarico di enum. – Teovald