9

Używam IntDef z Android Support annotation w moim kodu (ale moje pytanie jest szerszy zakres więc proszę zachować czytania :) tak:@IntDef adnotacja i wartość zwracana z kodu innego użytkownika, którego nie można adnotować lub jak tymczasowo wyłączyć adnotację od wpływu na kod?

public class UiLockMode 
{ 
    @IntDef({DEFAULT, NONE, VISIBLE, TRANSPARENT}) 
    @Retention(RetentionPolicy.SOURCE) 
    public @interface AllowedValues {} 

    public static final int DEFAULT  = 0; 
    public static final int NONE  = 1; 
    public static final int VISIBLE  = 2; 
    public static final int TRANSPARENT = 3; 
} 

Dalej, mam kilka innych metod adnotacją z nim tak:

protected void setLockMode(@UiLockMode.AllowedValues int lockMode) { 
    ... 

W tym momencie wszystko jest w porządku i ładne, ale problem pojawia się gdy chcę przekazać wartości zwracanej z innych metod setLockMode(), jak to jest z Parcelable realizacji:

private Foo(Parcel in) { 
    ... 
    setLockMode(in.getInt()); 

W takim przypadku moje IDE skarży się, że mogę używać tylko DEFAULT, NONE, VISIBLE, TRANSPARENT z setLockMode(). Ale getInt() nie jest moją metodą, więc nie mogę zanotować jej wartości zwracanej i sprawić, że wszystko to uszczęśliwi. Jestem również prawie pewien, że nie jest to przypadek wyjątkowy, ale nie udało mi się znaleźć sposobu na tymczasowe wyłączenie adnotacji ze złożenia skargi tutaj lub "wyrzucenia" wartości zwracanej z getInt(), aby nie skarżyć się na AllowedValue.

Moje pytania brzmią: czy istnieje jakiś sposób rozwiązania tego problemu? Może brakuje mi czegoś oczywistego na temat adnotacji, ale może będę tworzył raport o błędach, aby zamiast tego Google zareagował na ten problem?

Wszelkie uwagi i uwagi doceniane.

Odpowiedz

13

można stłumić IntDef ostrzeżenia strzępków dla metody poprzez opisywanie go z następujących czynności:

@SuppressWarnings("ResourceType") 

Można również wyłączyć te ostrzeżenia dla poszczególnych sprawozdań i całych klas - patrz Android Tools site do dalszej dokumentacji.

+0

Dzięki za odpowiedź, +1. Tak, wiem, że mogę stłumić ostrzeżenia, ale nie chciałbym, chyba że nie mam innej opcji, więc w zasadzie zastanawiam się, czy jest tu jakikolwiek inny sposób rozwiązania mojego problemu. –

+0

Przypuszczam, że możesz spróbować rozszerzyć Parcelę, aby dodać tam metodę myGetInt. – fractalwrench

+0

Tylko sprawdzanie i rozszerzanie nie jest drogą, ponieważ nadal będziesz narzekać, ponieważ adnotacja sprawia, że ​​oczekuje się, że "int" nie jest metodą. –

5

Jeśli tylko tłumić ostrzeżenie dla tej jednej oświadczenie wstawiania //noinspection ResourceType nad nim, nie jest to równoznaczne z „czyni go zrozumieć wartość zwracana przez getInt() w tym momencie jest poprawne”?

Alternatywnie można dodać do UiLockMode prostą metodę tłumaczenia z int na @UiLockMode, np. coś w rodzaju:

public @UiLockMode.AllowedValues static int lockModeTranslate(int val) 
{ 
    switch(val) 
    { 
     case 0: return UiLockMode.DEFAULT; 
     case 1: return UiLockMode.NONE; 
     case 2: return UiLockMode.TRANSPARENT; 
     case 3: return UiLockMode.VISIBLE; 
    } 

    throw new SomethingHorrible; 
} 

Następnie wywołanie takie jak setLockMode(UiLockMode.lockModeTranslate(in.getInt())); nie będzie już powodować ostrzeżenia.

+0

Cóż, tłumienie nie jest równoznaczne ze stwierdzeniem "jest to poprawna wartość". Często jest to powiedzenie "Nie mogę tego sprawdzić" lub "Nie obchodzi mnie to, czy jest ważne" (głównie w wyniku "Nie mogę tego sprawdzić"). Twój kod spowodowałby zamknięcie reklamacji, ale raczej nie jest rozwiązaniem. Gdybym miał to automatycznie wygenerowane (z innymi adnotacjami), to może byłoby dobrze, ale w przeciwnym razie tłumienie jest bardziej jasne. Szkoda, oczywiście ... –

+2

Czarna magia: public @UiLockMode.AllowedValues ​​static int lockModeTranslate (int val) { return val; } – hrules6872

+0

@ hrules6872, ale co jeśli przekażesz nieobsługiwaną wartość? –