Replacing Enums with Enumerated AnnotationsEdit PagePage History

Overview

“Magic constants” vagy type annotations are regular old Java constants decorated in a way that allows tools to recognize them as special values. Szintaxisuk nem különbözik a többi Java konstansétól. Ehelyett egy könnyen olvasható nevű megjegyzést kell létrehozni, amely felsorolja az összes kapcsolódó konstansot.

Ez az annotáció aztán díszíthet egy visszatérési értéket vagy egy metódusparamétert, így adva tippeket a használt eszközöknek az elfogadott vagy elvárható értékekről. Fő célja, hogy a forráskód írása során a metódusparaméterek és/vagy a metódusok visszatérési értékeinek típusbiztonságát érvényesítse.

Ezt tipikusan az enumok helyettesítésére használják. A Google a fejlesztői irányelveiben foglaltak szerint nem javasolja az enumok használatát az Android-alkalmazások fejlesztésénél: “Az enumok gyakran több mint kétszer annyi memóriát igényelnek, mint a statikus konstansok. Szigorúan kerülni kell az enumok használatát Androidon.”

Az IntDef

IntDef egy olyan mód az integer enum helyettesítésére, ahol van olyan paraméter, amely csak explicit int értékeket fogadhat el. Tegyük fel például, hogy egy takarmányelem típusát az alábbiak szerint akarjuk rögzíteni:

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

Most nincs validáció annak biztosítására, hogy a konstruktorba átadott típus érvényes legyen. A IntDef segítségével biztosíthatjuk, hogy az érték az elvárt értékek egyike legyen, megjegyzések hozzáadásával:

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

Az előző példában szereplő konstruktorhívás most hibát fog mutatni az Android Studio-ban, mert most már tudja, hogy milyen értékeket várjon. További részletekért olvassuk el a hivatalos Android annotációs útmutatót.

A StringDef

StringDef hasonló módon helyettesíti a string enumot, ahol van olyan paraméter, amely csak explicit string értékeket fogadhat el. Tegyük fel például, hogy egy beállítás értékét az alábbiak szerint akarjuk rögzíteni:

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

Most nincs érvényesítés annak biztosítására, hogy a konstruktorba átadott típus érvényes legyen. A StringDef segítségével biztosíthatjuk, hogy az érték az elvárt értékek egyike legyen, megjegyzések hozzáadásával:

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

Az előző példában szereplő konstruktorhívás most hibát fog mutatni az Android Studio-ban, mert most már tudja, hogy milyen értékeket várjon. További részletekért olvassa el a hivatalos Android annotációs útmutatót.