L'utilizzo di strumenti di controllo del codice, come lint, può aiutarti a trovare problemi e migliorare il codice, ma gli strumenti di controllo possono solo dedurre. Gli ID risorsa Android, ad esempio, utilizzano un int
per identificare stringhe, elementi grafici, colori e altri tipi di risorse, pertanto gli strumenti di ispezione non possono rilevare quando hai specificato una risorsa stringa anziché un colore. Questa situazione significa che il rendering della tua app potrebbe non essere corretto o l'app potrebbe non essere eseguita,
anche se utilizzi l'ispezione del codice.
Le annotazioni ti consentono di fornire suggerimenti a strumenti di ispezione del codice, come lint, per rilevare questi problemi di codice più sottili. Le annotazioni vengono aggiunte come tag di metadati che vengono allegati a variabili, parametri e valori restituiti per esaminare i valori restituiti del metodo, i parametri passati, le variabili locali e i campi. Se utilizzate con strumenti di ispezione del codice, le annotazioni possono aiutarti a rilevare problemi come eccezioni di puntatore nullo e conflitti di tipo di risorsa.
Android supporta una serie di annotazioni tramite la
libreria Jetpack Annotations.
Puoi accedere alla libreria tramite il pacchetto
androidx.annotation
.
Nota: se un modulo ha una dipendenza da un processore di annotazioni,
devi utilizzare la configurazione delle dipendenze kapt
o ksp
per Kotlin
o la configurazione delle dipendenze annotationProcessor
per Java per aggiungere
questa dipendenza.
Aggiungere annotazioni al progetto
Per attivare le annotazioni nel tuo progetto, aggiungi la dipendenza androidx.annotation:annotation
alla tua libreria o app. Tutte le annotazioni che aggiungi vengono controllate quando esegui un'ispezione del codice o un'attività lint
.
Aggiungi la dipendenza della libreria Jetpack Annotations
La libreria Jetpack Annotations è pubblicata nel
Repository Maven di Google.
Per aggiungere la libreria Jetpack Annotations al tuo progetto, includi la seguente
riga nel blocco dependencies
del file build.gradle
o
build.gradle.kts
:
Kotlin
dependencies { implementation("androidx.annotation:annotation:1.9.1") }
Groovy
dependencies { implementation 'androidx.annotation:annotation:1.9.1' }
Se utilizzi le annotazioni nel tuo modulo di libreria, queste vengono incluse come parte dell'artefatto
Android Archive (AAR) in formato XML nel file annotations.zip
. L'aggiunta della
dipendenza androidx.annotation
non introduce una dipendenza per gli utenti downstream
della tua libreria.
Nota:se utilizzi altre librerie Jetpack,
potresti non dover aggiungere la dipendenza androidx.annotation
. Poiché molte altre librerie Jetpack dipendono dalla libreria Annotations, potresti già avere accesso alle annotazioni.
Per un elenco completo delle annotazioni incluse nel repository Jetpack, consulta il
riferimento della libreria Jetpack Annotations o utilizza la funzionalità di completamento automatico per visualizzare le opzioni disponibili per l'istruzione
import androidx.annotation.
.
Esegui ispezioni del codice
Per avviare un'ispezione del codice da Android Studio, che include la convalida delle annotazioni e il controllo lint automatico, seleziona Analizza > Ispeziona codice dal menu. Android Studio mostra messaggi di conflitto per segnalare potenziali problemi in cui il codice è in conflitto con le annotazioni e per suggerire possibili soluzioni.
Puoi anche applicare le annotazioni eseguendo l'attività
lint
utilizzando la riga di comando. Sebbene possa essere utile per segnalare problemi
con un server di integrazione continua, l'attività lint
non applica le annotazioni
di nullità (descritte nella sezione seguente); solo Android Studio lo fa. Per ulteriori
informazioni sull'attivazione e l'esecuzione di ispezioni
lint, consulta Migliorare il codice con i controlli
lint.
Sebbene i conflitti di annotazione generino avvisi, questi non impediscono la compilazione dell'app.
Annotazioni di nullabilità
Le annotazioni di nullabilità possono essere utili nel codice Java per imporre se i valori possono essere nulli. Sono meno utili nel codice Kotlin, in quanto Kotlin dispone di regole di nullabilità integrate che vengono applicate in fase di compilazione.Aggiungi le annotazioni @Nullable
e
@NonNull
per verificare la nullità di una determinata variabile, parametro o valore restituito. L'annotazione @Nullable
indica una variabile, un parametro o un valore restituito che può essere null.
@NonNull
indica una variabile, un parametro o un valore restituito che non può essere nullo.
Ad esempio, se una variabile locale che contiene un valore null viene passata come parametro a un metodo
con l'annotazione @NonNull
allegata a quel parametro, la compilazione del codice genera un
avviso che indica un conflitto non null. Inoltre, il tentativo di fare riferimento al risultato di un metodo contrassegnato da @Nullable
senza prima verificare se il risultato è nullo genera un avviso di nullità. Utilizza @Nullable
sul valore restituito di un metodo
solo se ogni utilizzo del metodo deve essere controllato esplicitamente per verificare la presenza di valori nulli.
Il seguente esempio mostra la nullabilità in azione. Il codice di esempio Kotlin non utilizza
l'annotazione @NonNull
perché viene aggiunta automaticamente al bytecode generato
quando viene specificato un tipo non nullabile. L'esempio Java utilizza l'annotazione @NonNull
sui parametri context
e attrs
per verificare che i valori dei parametri passati
non siano nulli. Inoltre, verifica che il metodo onCreateView()
non restituisca un valore nullo:
Kotlin
... /** Annotation not used because of the safe-call operator(?)**/ override fun onCreateView( name: String?, context: Context, attrs: AttributeSet ): View? { ... } ...
Java
import androidx.annotation.NonNull; ... /** Add support for inflating the <fragment> tag. **/ @NonNull @Override public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) { ... } ...
Analisi di nullabilità
Android Studio supporta l'esecuzione di un'analisi di nullabilità per dedurre e inserire automaticamente le annotazioni di nullità nel codice. Un'analisi di nullabilità esamina i contratti in tutte le gerarchie dei metodi nel tuo codice per rilevare:
- Metodi di chiamata che possono restituire valori nulli.
- Metodi che non devono restituire null.
- Variabili, ad esempio campi, variabili locali e parametri, che possono essere nulli.
- Variabili, ad esempio campi, variabili locali e parametri, che non possono contenere un valore nullo.
L'analisi inserisce automaticamente le annotazioni nulle appropriate nelle posizioni rilevate.
Per eseguire un'analisi di nullabilità in Android Studio, seleziona Analizza >
Inferisci nullità. Android Studio inserisce le annotazioni Android @Nullable
e @NonNull
nelle posizioni rilevate nel codice. Dopo aver eseguito un'analisi nulla, è consigliabile verificare le annotazioni inserite.
Nota:quando aggiungi annotazioni di nullità, il completamento automatico potrebbe
suggerire le annotazioni IntelliJ
@Nullable
e
@NotNull
anziché le annotazioni di nullità di Android e potrebbe importare automaticamente la libreria corrispondente. Tuttavia, il controllo lint di Android Studio
cerca solo le annotazioni di nullità di Android. Quando verifichi le
annotazioni, assicurati che il tuo progetto utilizzi le annotazioni di nullabilità di Android in modo che
il controllo lint possa avvisarti correttamente durante l'ispezione del codice.
Annotazioni delle risorse
La convalida dei tipi di risorse può essere utile perché i riferimenti di Android alle risorse, come le risorse drawable e string, vengono passati come numeri interi.
Il codice che prevede che un parametro faccia riferimento a un tipo specifico di risorsa, ad esempio un String
,
può essere passato al tipo di riferimento previsto di int
, ma in realtà fa riferimento a un tipo diverso
di risorsa, ad esempio una risorsa R.string
.
Ad esempio, aggiungi annotazioni @StringRes
per verificare se un parametro di risorsa contiene un riferimento R.string
, come mostrato di seguito:
Kotlin
abstract fun setTitle(@StringRes resId: Int)
Java
public abstract void setTitle(@StringRes int resId)
Durante l'ispezione del codice, l'annotazione genera un avviso se un riferimento R.string
non viene passato nel parametro.
Le annotazioni per altri tipi di risorse, come @DrawableRes
, @DimenRes
, @ColorRes
e @InterpolatorRes
, possono essere
aggiunte utilizzando lo stesso formato di annotazione ed eseguite durante l'ispezione del codice.
Se il parametro
supporta più tipi di risorse, puoi inserire più di un'annotazione del tipo di risorsa in un determinato
parametro. Utilizza @AnyRes
per indicare che il parametro annotato può essere qualsiasi tipo di risorsa R
.
Anche se puoi utilizzare @ColorRes
per specificare che un parametro deve essere una risorsa di colore, un numero intero di colore (nel formato RRGGBB
o AARRGGBB
) non viene riconosciuto come risorsa di colore. Utilizza invece l'annotazione @ColorInt
per
indicare che un parametro deve essere un numero intero di colore. Gli strumenti di compilazione segnaleranno il codice errato che
passa un ID risorsa colore come android.R.color.black
, anziché un numero intero di colore,
ai metodi annotati.
Annotazioni Thread
Le annotazioni dei thread verificano se un metodo viene chiamato da un tipo specifico di thread. Sono supportate le seguenti annotazioni dei thread:
Gli strumenti di compilazione considerano le annotazioni @MainThread
e
@UiThread
intercambiabili, quindi puoi chiamare i metodi @UiThread
dai metodi @MainThread
e viceversa. Tuttavia, è possibile che un thread
dell'UI sia diverso dal thread principale, nel caso di app di sistema con più visualizzazioni
su thread diversi. Pertanto, devi annotare i metodi associati alla gerarchia delle visualizzazioni di un'app
con @UiThread
e annotare solo i metodi associati al ciclo di vita di un'app con
@MainThread
.
Se tutti i metodi di una classe condividono lo stesso requisito di threading, puoi aggiungere una singola annotazione di thread alla classe per verificare che tutti i metodi della classe vengano chiamati dallo stesso tipo di thread.
Un utilizzo comune delle annotazioni dei thread è la convalida che i metodi o le classi annotati con
@WorkerThread
vengano chiamati solo da un thread in background appropriato.
Annotazioni dei vincoli di valore
Utilizza le annotazioni @IntRange
,
@FloatRange
e
@Size
per
convalidare i valori dei parametri trasmessi. Sia @IntRange
che @FloatRange
sono più utili se applicati a parametri in cui gli utenti potrebbero sbagliare l'intervallo.
L'annotazione @IntRange
verifica che un valore parametro intero o lungo
rientri in un intervallo specificato. Il seguente esempio indica che il parametro alpha
deve contenere un valore intero compreso tra 0 e 255:
Kotlin
fun setAlpha(@IntRange(from = 0, to = 255) alpha: Int) { ... }
Java
public void setAlpha(@IntRange(from=0,to=255) int alpha) { ... }
L'annotazione @FloatRange
verifica se un valore di parametro float o double
rientra in un intervallo specificato di valori con virgola mobile. Il seguente esempio indica che il parametro
alpha
deve contenere un valore float compreso tra 0,0 e 1,0:
Kotlin
fun setAlpha(@FloatRange(from = 0.0, to = 1.0) alpha: Float) {...}
Java
public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {...}
L'annotazione @Size
controlla le dimensioni di una raccolta o
di un array o la lunghezza di una stringa. L'annotazione @Size
può essere utilizzata per verificare
le seguenti qualità:
- Dimensioni minime, ad esempio
@Size(min=2)
- Dimensione massima, ad esempio
@Size(max=2)
- Dimensioni esatte, ad esempio
@Size(2)
- Un numero di cui la dimensione deve essere un multiplo, ad esempio
@Size(multiple=2)
Ad esempio, @Size(min=1)
verifica se una raccolta non è vuota, mentre @Size(3)
convalida che un array contenga esattamente tre valori.
L'esempio seguente indica che l'array
location
deve contenere almeno un elemento:
Kotlin
fun getLocation(button: View, @Size(min=1) location: IntArray) { button.getLocationOnScreen(location) }
Java
void getLocation(View button, @Size(min=1) int[] location) { button.getLocationOnScreen(location); }
Annotazioni delle autorizzazioni
Utilizza l'annotazione @RequiresPermission
per convalidare le autorizzazioni del chiamante di un metodo. Per verificare una singola autorizzazione
da un elenco di autorizzazioni valide, utilizza l'attributo anyOf
. Per verificare un insieme di
autorizzazioni, utilizza l'attributo allOf
. L'esempio seguente annota il metodo
setWallpaper()
per indicare che il chiamante del metodo deve disporre dell'autorizzazione
permission.SET_WALLPAPERS
:
Kotlin
@RequiresPermission(Manifest.permission.SET_WALLPAPER) @Throws(IOException::class) abstract fun setWallpaper(bitmap: Bitmap)
Java
@RequiresPermission(Manifest.permission.SET_WALLPAPER) public abstract void setWallpaper(Bitmap bitmap) throws IOException;
L'esempio seguente richiede che il chiamante del metodo copyImageFile()
disponga dell'accesso in lettura all'archiviazione esterna e ai metadati di posizione
nell'immagine copiata:
Kotlin
@RequiresPermission(allOf = [ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_MEDIA_LOCATION ]) fun copyImageFile(dest: String, source: String) { ... }
Java
@RequiresPermission(allOf = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_MEDIA_LOCATION}) public static final void copyImageFile(String dest, String source) { //... }
Per le autorizzazioni sugli intent, inserisci il requisito di autorizzazione nel campo stringa che definisce il nome dell'azione intent:
Kotlin
@RequiresPermission(android.Manifest.permission.BLUETOOTH) const val ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE"
Java
@RequiresPermission(android.Manifest.permission.BLUETOOTH) public static final String ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
Per le autorizzazioni sui fornitori di contenuti che richiedono autorizzazioni separate per l'accesso in lettura e scrittura, inserisci ogni requisito di autorizzazione in un'annotazione @RequiresPermission.Read
o @RequiresPermission.Write
:
Kotlin
@RequiresPermission.Read(RequiresPermission(READ_HISTORY_BOOKMARKS)) @RequiresPermission.Write(RequiresPermission(WRITE_HISTORY_BOOKMARKS)) val BOOKMARKS_URI = Uri.parse("content://browser/bookmarks")
Java
@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS)) @RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS)) public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
Autorizzazioni indirette
Quando un'autorizzazione dipende dal valore specifico fornito al parametro di un metodo, utilizza
@RequiresPermission
sul parametro stesso senza elencare le autorizzazioni specifiche.
Ad esempio, il metodo startActivity(Intent)
utilizza un'autorizzazione indiretta sull'intent passato al metodo:
Kotlin
abstract fun startActivity(@RequiresPermission intent: Intent, bundle: Bundle?)
Java
public abstract void startActivity(@RequiresPermission Intent intent, @Nullable Bundle)
Quando utilizzi le autorizzazioni indirette, gli strumenti di build eseguono l'analisi del flusso di dati per verificare se l'argomento passato al metodo contiene annotazioni @RequiresPermission
. Quindi, applica
le annotazioni esistenti dal parametro al metodo stesso. Nell'esempio
startActivity(Intent)
, le annotazioni nella classe Intent
causano gli avvisi risultanti
sugli utilizzi non validi di startActivity(Intent)
quando un intent senza le autorizzazioni
appropriate viene passato al metodo, come mostrato nella Figura 1.

Figura 1. L'avviso generato da un'annotazione di autorizzazioni indirette sul metodo startActivity(Intent)
.
Gli strumenti di compilazione generano l'avviso su startActivity(Intent)
dall'annotazione
sul nome dell'azione intent corrispondente nella classe Intent
:
Kotlin
@RequiresPermission(Manifest.permission.CALL_PHONE) const val ACTION_CALL = "android.intent.action.CALL"
Java
@RequiresPermission(Manifest.permission.CALL_PHONE) public static final String ACTION_CALL = "android.intent.action.CALL";
Se necessario, puoi sostituire @RequiresPermission
con
@RequiresPermission.Read
o @RequiresPermission.Write
quando annoti
il parametro di un metodo. Tuttavia, per le autorizzazioni indirette @RequiresPermission
non deve essere utilizzato insieme alle annotazioni delle autorizzazioni di lettura o scrittura.
Annotazioni del valore restituito
Utilizza l'annotazione @CheckResult
per
verificare che il risultato o il valore restituito di un metodo venga effettivamente utilizzato. Anziché annotare ogni metodo
non nullo con @CheckResult
, aggiungi l'annotazione per chiarire i risultati di
metodi potenzialmente ambigui.
Ad esempio, i nuovi sviluppatori Java spesso pensano erroneamente che
<String>.trim()
rimuova gli spazi bianchi dalla stringa originale. L'annotazione
del metodo con i flag @CheckResult
utilizza <String>.trim()
quando il chiamante non fa nulla con il valore restituito del metodo.
L'esempio seguente annota il metodo checkPermissions()
per verificare se viene fatto riferimento al valore restituito del metodo. Inoltre, indica il metodo enforcePermission()
come metodo da suggerire allo sviluppatore come sostituzione:
Kotlin
@CheckResult(suggest = "#enforcePermission(String,int,int,String)") abstract fun checkPermission(permission: String, pid: Int, uid: Int): Int
Java
@CheckResult(suggest="#enforcePermission(String,int,int,String)") public abstract int checkPermission(@NonNull String permission, int pid, int uid);
Annotazioni CallSuper
Utilizza l'annotazione @CallSuper
per
verificare che un metodo di override chiami l'implementazione super del metodo.
L'esempio
seguente annota il metodo onCreate()
per garantire che qualsiasi implementazione del metodo di override
chiami super.onCreate()
:
Kotlin
@CallSuper override fun onCreate(savedInstanceState: Bundle?) { }
Java
@CallSuper protected void onCreate(Bundle savedInstanceState) { }
Annotazioni typedef
Le annotazioni typedef verificano se un determinato parametro, valore restituito o campo fa riferimento a un insieme specifico di costanti. Inoltre, consentono il completamento del codice per offrire automaticamente le costanti consentite.
Utilizza le annotazioni @IntDef
e
@StringDef
per creare annotazioni enumerate di insiemi di numeri interi e stringhe per convalidare altri
tipi di riferimenti al codice.
Le annotazioni Typedef utilizzano @interface
per dichiarare il nuovo tipo di annotazione enumerata.
Le annotazioni @IntDef
e @StringDef
, insieme a
@Retention
, annotano la nuova annotazione e sono necessarie per definire il
tipo enumerato. L'annotazione @Retention(RetentionPolicy.SOURCE)
indica al compilatore
di non memorizzare i dati di annotazione enumerati nel file .class
.
L'esempio seguente mostra i passaggi per creare un'annotazione che controlla se un valore passato come parametro del metodo fa riferimento a una delle costanti definite:
Kotlin
import androidx.annotation.IntDef //... // Define the list of accepted constants and declare the NavigationMode annotation. @Retention(AnnotationRetention.SOURCE) @IntDef(NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS) annotation class NavigationMode // Declare the constants. const val NAVIGATION_MODE_STANDARD = 0 const val NAVIGATION_MODE_LIST = 1 const val NAVIGATION_MODE_TABS = 2 abstract class ActionBar { // Decorate the target methods with the annotation. // Attach the annotation. @get:NavigationMode @setparam:NavigationMode abstract var navigationMode: Int }
Java
import androidx.annotation.IntDef; //... public abstract class ActionBar { //... // Define the list of accepted constants and declare the NavigationMode annotation. @Retention(RetentionPolicy.SOURCE) @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) public @interface NavigationMode {} // Declare the constants. public static final int NAVIGATION_MODE_STANDARD = 0; public static final int NAVIGATION_MODE_LIST = 1; public static final int NAVIGATION_MODE_TABS = 2; // Decorate the target methods with the annotation. @NavigationMode public abstract int getNavigationMode(); // Attach the annotation. public abstract void setNavigationMode(@NavigationMode int mode); }
Quando crei questo codice, viene generato un avviso se il parametro mode
non
fa riferimento a una delle costanti definite (NAVIGATION_MODE_STANDARD
,
NAVIGATION_MODE_LIST
o NAVIGATION_MODE_TABS
).
Combina @IntDef
e @IntRange
per indicare che un
numero intero può essere un determinato insieme di costanti o un valore all'interno di un intervallo.
Attivare la combinazione di costanti con flag
Se gli utenti possono combinare le costanti consentite con un flag (ad esempio |
,
&
, ^
e così via), puoi definire un'annotazione con un
attributo flag
per verificare se un parametro o un valore restituito fa riferimento a un pattern valido.
L'esempio seguente crea l'annotazione DisplayOptions
con un elenco di costanti DISPLAY_
valide:
Kotlin
import androidx.annotation.IntDef ... @IntDef(flag = true, value = [ DISPLAY_USE_LOGO, DISPLAY_SHOW_HOME, DISPLAY_HOME_AS_UP, DISPLAY_SHOW_TITLE, DISPLAY_SHOW_CUSTOM ]) @Retention(AnnotationRetention.SOURCE) annotation class DisplayOptions ...
Java
import androidx.annotation.IntDef; ... @IntDef(flag=true, value={ DISPLAY_USE_LOGO, DISPLAY_SHOW_HOME, DISPLAY_HOME_AS_UP, DISPLAY_SHOW_TITLE, DISPLAY_SHOW_CUSTOM }) @Retention(RetentionPolicy.SOURCE) public @interface DisplayOptions {} ...
Quando crei codice con un flag di annotazione, viene generato un avviso se il parametro decorato o il valore restituito non fa riferimento a un pattern valido.
Mantieni annotazione
L'annotazione @Keep
garantisce che una classe o un metodo annotato non venga rimosso quando il codice
viene compresso in fase di compilazione. Questa annotazione viene in genere aggiunta a metodi e classi a cui si accede tramite reflection per impedire al compilatore di considerare il codice come inutilizzato.
Attenzione: le classi e i metodi annotati
utilizzando @Keep
vengono sempre visualizzati nell'APK dell'app, anche se non fai mai
riferimento a queste classi e metodi nella logica dell'app.
Per mantenere ridotte le dimensioni dell'app, valuta se è necessario conservare
ogni annotazione @Keep
nell'app. Se utilizzi la reflection per
accedere a una classe o a un metodo annotato, utilizza una
condizione
-if
nelle regole ProGuard, specificando la classe
che effettua le chiamate di reflection.
Per saperne di più su come minimizzare il codice e specificare quale codice non deve essere rimosso, consulta la pagina Ridurre, offuscare e ottimizzare l'app.
Annotazioni sulla visibilità del codice
Utilizza le seguenti annotazioni per indicare la visibilità di parti specifiche del codice, ad esempio metodi, classi, campi o pacchetti.
Rendere visibile il codice per il test
L'annotazione
@VisibleForTesting
indica che un metodo annotato è più visibile del necessario per rendere il
metodo testabile. Questa annotazione ha un argomento otherwise
facoltativo che ti consente di
specificare quale sarebbe la visibilità del metodo se non fosse necessario renderlo visibile
per i test. Lint utilizza l'argomento otherwise
per applicare la visibilità prevista.
Nell'esempio seguente, myMethod()
è normalmente private
, ma è
package-private
per i test. Con la designazione VisibleForTesting.PRIVATE
, lint mostra un messaggio se questo metodo viene chiamato al di fuori del contesto consentito dall'accesso private
, ad esempio da un'unità di compilazione diversa.
Kotlin
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun myMethod() { ... }
Java
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) void myMethod() { ... }
Puoi anche specificare @VisibleForTesting(otherwise = VisibleForTesting.NONE)
per indicare che un metodo esiste solo per i test. Questo modulo equivale all'utilizzo di
@RestrictTo(TESTS)
. Entrambi eseguono lo stesso controllo lint.
Limitare un'API
L'annotazione @RestrictTo
indica che l'accesso all'API annotata (pacchetto, classe o metodo) è limitato,
come segue:
Sottoclassi
Utilizza il modulo di annotazione @RestrictTo(RestrictTo.Scope.SUBCLASSES)
per limitare
l'accesso all'API alle sole sottoclassi.
Solo le classi che estendono la classe annotata possono accedere a questa API. Il modificatore Java
protected
non è sufficientemente restrittivo, perché consente l'accesso
da classi non correlate all'interno dello stesso pacchetto. Inoltre, ci sono casi in cui vuoi lasciare un metodo public
per una maggiore flessibilità futura, perché non puoi mai creare un metodo protected
e sottoposto a override public
, ma vuoi fornire un suggerimento che la classe è destinata all'utilizzo all'interno della classe o solo dalle sottoclassi.
Biblioteche
Utilizza il modulo di annotazione @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
per
limitare l'accesso all'API alle tue sole librerie.
Solo il codice della libreria può accedere all'API annotata. In questo modo, non solo puoi organizzare il codice
nella gerarchia di pacchetti che preferisci, ma anche condividerlo
tra un gruppo di librerie correlate. Questa opzione è già disponibile per le librerie Jetpack
che contengono molto codice di implementazione non destinato all'uso esterno, ma che
deve essere public
per condividerlo tra le varie librerie Jetpack complementari.
Test
Utilizza il modulo di annotazione @RestrictTo(RestrictTo.Scope.TESTS)
per impedire ad altri
sviluppatori di accedere alle tue API di test.
Solo il codice di test può accedere all'API annotata. In questo modo, altri sviluppatori non potranno utilizzare le API per lo sviluppo che intendi utilizzare solo a scopo di test.