24

Mam ENUM:wyliczenia i Android adnotacja intDef

public enum AppEnums { 
    SERVICE_ERROR, 
    CONNECTION_ERROR; 
} 

i chcę go używać w intDef Android dopiskiem

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

błąd pokazuje:

niezgodna Znaleziono typy, wymagane: "długi"

Co mogę zrobić z tą niezgodnością?

Nie chcę ręcznie obsługiwać wartości parametrów AppEum, Zazwyczaj generuj wartości automatycznie. AppEnums.CONNECTION_ERROR.ordinal() zwraca wartość int parametru enum, ale tutaj nie działa.

+1

Cóż, nie możesz zrobić tego w ten sposób. AppEnums .SERVICE_ERROR nigdy nie zwrócą int; zwróci AppEnums .SERVICE_ERROR. To jest punkt wyliczonych typów. – Bhargav

+4

'@ IntDef' działa tylko z liczbą całkowitą. Jeśli chcesz pracować z Enum, nie potrzebujesz '@ IntDef'. Po prostu użyj Enum jako parametru. –

+0

Nigdy nie powinieneś polegać na wartości porządkowej stałych enum, ponieważ zmiana kolejności stałych subtelnie złamałaby twój kod - najgorszy rodzaj złamania. –

Odpowiedz

8

Cóż, nie możesz tego zrobić w ten sposób. AppEnums.SERVICE_ERROR nigdy nie zwróci int; to zwróci AppEnums.SERVICE_ERROR. To jest punkt wyliczonych typów.

Co mogę zaproponować to:

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

Skopiowane z komentarzem Yazazzello jest poniżej:

IntDef - nowe wyliczenia dla rozwoju Android. Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android. tak IntDef gdzie ma zastąpić wyliczenia, nie można używać Enum w IntDef deklaracji

+0

Nie chcę ręcznie obsługiwać wartości parametrów AppEnum, wyliczaj wartości automatycznie w sposób zwykły. – AliSh

+1

tak, ale nie są one uważane za wartości stałe, można użyć metody ordinal() dla Enums i przypisać ją do pewnych stałych pól i użyć tych stałych pól w adnotacji IntDef – Bhargav

+4

IntDef - nowe Enums dla rozwoju Androida. [Enumy często wymagają więcej niż dwukrotnie więcej pamięci niż stałe statyczne. Powinieneś bezwzględnie unikać wyliczania na Androidzie.] (Https://developer.android.com/training/articles/memory.html#Overhead) więc IntDef gdzie ma zastąpić Enums, nie możesz używać Enum w deklaracjach IntDef – Yazazzello

26

Ideą IntDef adnotacji jest użycie zestawu int stałych jak enum, ale bezenum. W tym przypadku musisz zadeklarować wszystkie stałe ręcznie.

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

Można zobaczyć szczegółowy przykład here.

+0

Nie chcę ręcznie obsługiwać wartości parametrów AppEum, Zazwyczaj generuj wartości automatycznie. AppEnums.CONNECTION_ERROR.ordinal() zwraca wartość int parametru enum, ale nie działają tutaj. – AliSh

+2

Cóż, intdef nie jest dla ciebie. Celem intdef jest usunięcie nadmiaru enum. – Teovald