9

Sto usando IntDef da Android Support annotation nel mio codice (ma la mia domanda è di più ampia portata quindi per favore continuate a leggere :) come questo:annotazione @IntDef e valore di ritorno dal codice di altri che non può essere annotato o come disattivare temporaneamente l'annotazione dal codice?

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

successivo, ho avuto alcuni altri metodi annotati con essa in questo modo:

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

a quel punto è tutto soddisfacente e piacevole, ma il problema si presenta quando desidero passare valore restituito da altri metodi per setLockMode(), come cioè da Parcelable attuazione:

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

In tal caso il mio IDE lamenta che sono autorizzato a utilizzare solo DEFAULT, NONE, VISIBLE, TRANSPARENT con setLockMode(). Ma il getInt() non è il mio metodo, quindi non posso annotare il suo valore restituito e rendere tutto ciò felice. Sono anche quasi sicuro che non si tratti di un caso di utilizzo unico, ma non sono riuscito a trovare il modo di disabilitare temporaneamente l'annotazione AllowedValues da lamentarsi qui o di "trasmettere" il valore restituito da getInt() per fare in modo che AllowedValue non si lamenti.

Quindi le mie domande sono: esiste un modo per risolvere questo problema? Forse mi manca qualcosa di ovvio sulle annotazioni, ma forse dovrò creare una segnalazione di bug per far sì che Google risolva questo problema?

Qualsiasi input o pensiero apprezzato.

risposta

13

È possibile sopprimere IntDef avvertenze Lint per un metodo annotando con il seguente:

@SuppressWarnings("ResourceType") 

È possibile anche disattivare questi avvisi per i singoli dichiarazioni e intere classi - vedere la Android Tools site per ulteriore documentazione.

+0

Grazie per la risposta, +1. Sì, so che posso sopprimere gli avvertimenti, ma mi piacerebbe non farlo a meno che non avessi altre opzioni, quindi in fondo mi chiedo se qui c'è un altro modo per risolvere il mio problema. –

+0

Suppongo che potresti provare a estendere Parcel per aggiungere il metodo myGetInt. – fractalwrench

+0

Appena controllato ed esteso non è un modo per andare come si vedrà ancora lamentarsi come annotazione fa prevedere 'int' non un metodo. –

5

Se si sopprime solo l'avviso per questa singola istruzione inserendo sopra //noinspection ResourceType, non è equivalente a "far capire che il valore restituito da getInt() a questo punto è corretto"?

In alternativa, è possibile aggiungere a UiLockMode un semplice metodo di conversione da int a @UiLockMode, ad es. qualcosa sulla falsariga di:

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

Poi una chiamata come setLockMode(UiLockMode.lockModeTranslate(in.getInt())); non sarà più causare un avvertimento.

+0

Bene, sopprimere non è un modo equivalente per dire "questo è un valore corretto". Spesso è un modo per dire "Non posso controllare davvero" o "Non mi interessa che sia valido o no" (principalmente come risultato di "Non riesco a controllarlo davvero" :). Il tuo codice chiuderebbe i reclami ma è piuttosto un lavoro attorno a non una soluzione. Se avessi questa cosa generata automaticamente (con altre annotazioni) allora forse sarebbe ok, ma altrimenti la soppressione è più chiara. Peccato, ovviamente ... –

+2

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

+0

@ hrules6872 ma cosa succede se si passa il valore non supportato? –