Înlocuirea enumerațiilor enumerative cu adnotări enumerativeEdit PagePage History

Prezentare generală

„Constantele magice” sau adnotările de tip sunt vechile constante Java obișnuite, decorate într-un mod care permite instrumentelor să le recunoască drept valori speciale. Sintaxa lor nu este diferită de orice altă constantă Java. În schimb, trebuie creată o adnotare cu un nume ușor de citit care enumeră toate constantele aferente.

Această adnotare poate decora apoi o valoare de retur sau un parametru de metodă, oferind indicii instrumentelor pe care le utilizați cu privire la valorile care sunt acceptate sau care pot fi așteptate. Principalul lor scop este de a impune siguranța de tip pentru parametrii de metodă și/sau valorile de retur ale metodei în timpul scrierii codului sursă.

Aceasta este utilizată de obicei pentru a înlocui enumerațiile. Google descurajează utilizarea enumelor în dezvoltarea aplicațiilor Android, după cum se menționează în ghidul lor pentru dezvoltatori: „Enums necesită adesea mai mult de două ori mai multă memorie decât constantele statice. Ar trebui să evitați cu strictețe utilizarea enum-urilor pe Android.”

IntDef

IntDef este o modalitate de a înlocui un enum de numere întregi în cazul în care există un parametru care ar trebui să accepte doar valori int explicite. De exemplu, să presupunem că dorim să înregistrăm tipul unui element de alimentare așa cum se arată mai jos:

public class ItemTypeDescriptor { public static final int TYPE_MUSIC = 0; public static final int TYPE_PHOTO = 1; public static final int TYPE_TEXT = 2; public final int itemType; public ItemTypeDescriptor(int itemType) { this.itemType = itemType; }}

În acest moment nu există validări care să asigure că tipul transmis în constructor este valid. Putem folosi IntDef pentru a ne asigura că valoarea este una dintre valorile așteptate prin adăugarea de adnotări:

public class ItemTypeDescriptor { // ... type definitions // Describes when the annotation will be discarded @Retention(RetentionPolicy.SOURCE) // Enumerate valid values for this interface @IntDef({TYPE_MUSIC, TYPE_PHOTO, TYPE_TEXT}) // Create an interface for validating int types public @interface ItemTypeDef {} // Declare the constants public static final int TYPE_MUSIC = 0; public static final int TYPE_PHOTO = 1; public static final int TYPE_TEXT = 2; // Mark the argument as restricted to these enumerated types public ItemTypeDescriptor(@ItemTypeDef int itemType) { this.itemType = itemType; }}

Acelasi apel de constructor din ultimul exemplu va afișa acum o eroare în Android Studio, deoarece acum știe la ce valori să se aștepte. Consultați ghidul oficial al adnotărilor Android pentru mai multe detalii.

StringDef

StringDef este, în mod similar, o modalitate de a înlocui un enum de șiruri de caractere în cazul în care există un parametru care ar trebui să accepte numai valori explicite de șiruri de caractere. De exemplu, să presupunem că dorim să înregistrăm valoarea unui parametru așa cum se arată mai jos:

public class FilterColorDescriptor { public static final String FILTER_BLUE = "blue"; public static final String FILTER_RED = "red"; public static final String FILTER_GRAY = "gray"; public final String filterColor; public FilterColorDescriptor(String filterColor) { this.filterColor = filterColor; }}

În acest moment nu există validări pentru a ne asigura că tipul transmis în constructor este valid. Putem folosi StringDef pentru a ne asigura că valoarea este una dintre valorile așteptate prin adăugarea de adnotări:

public class FilterColorDescriptor { // ... type definitions // Describes when the annotation will be discarded @Retention(RetentionPolicy.SOURCE) // Enumerate valid values for this interface @StringDef({FILTER_BLUE, FILTER_RED, FILTER_GRAY}) // Create an interface for validating String types public @interface FilterColorDef {} // Declare the constants public static final String FILTER_BLUE = "blue"; public static final String FILTER_RED = "red"; public static final String FILTER_GRAY = "gray"; // Mark the argument as restricted to these enumerated types public FilterColorDescriptor(@FilterColorDef String filterColor) { this.filterColor = filterColor; }}

Același apel de constructor din ultimul exemplu va afișa acum o eroare în Android Studio, deoarece acum știe la ce valori să se aștepte. Consultați ghidul oficial al adnotărilor Android pentru mai multe detalii.

.