Enumien korvaaminen luetelluilla merkinnöilläMuokkaa sivuaSivun muokkausHistoria

Yleiskatsaus

”Taikavakiot” tai tyyppihuomautukset ovat tavallisia vanhoja Java-vakiotyyppejä, jotka on koristeltu tavalla, jonka avulla työkalut pystyvät tunnistamaan ne erikoisarvoina. Niiden syntaksi ei poikkea mistään muusta Java-vakiosta. Sen sijaan on luotava annotaatio, jolla on helposti luettava nimi ja jossa luetellaan kaikki siihen liittyvät vakiot.

Tällä annotaatiolla voidaan sitten koristella paluuarvoa tai metodiparametria, mikä antaa käyttämillesi työkaluille vihjeitä hyväksytyistä tai odotettavissa olevista arvoista. Niiden päätarkoitus on pakottaa metodiparametrien ja/tai metodien paluuarvojen tyyppiturvallisuus lähdekoodia kirjoitettaessa.

Tätä käytetään tyypillisesti enumien korvaamiseen. Google ei suosittele enumien käyttöä Android-sovelluskehityksessä, kuten heidän kehittäjäohjeissaan todetaan: ”Enumit vaativat usein yli kaksi kertaa enemmän muistia kuin staattiset vakiot. Sinun tulisi ehdottomasti välttää enumien käyttöä Androidissa.”

IntDef

IntDef on tapa korvata kokonaisluku enum, jossa on parametri, jonka pitäisi hyväksyä vain yksiselitteisiä int-arvoja. Oletetaan esimerkiksi, että haluamme tallentaa syötteen tyypin alla esitetyllä tavalla:

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

Juuri nyt ei ole validointeja, joilla varmistetaan, että konstruktoriin syötetty tyyppi on kelvollinen. Voimme käyttää IntDef varmistaaksemme, että arvo on yksi odotetuista arvoista lisäämällä merkintöjä:

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

Sama konstruktorin kutsu edellisestä esimerkistä näyttää nyt virheen Android Studiossa, koska nyt se tietää, mitä arvoja odottaa. Katso lisätietoja Androidin virallisesta annotaatio-oppaasta.

StringDef

StringDef on vastaavasti tapa korvata merkkijono enum, jossa on parametri, jonka pitäisi hyväksyä vain eksplisiittisiä merkkijonoarvoja. Oletetaan esimerkiksi, että halutaan tallentaa arvo asetukselle alla esitetyllä tavalla:

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

Juuri nyt ei ole validointeja, joilla varmistetaan, että konstruktoriin syötetty tyyppi on kelvollinen. Voimme käyttää StringDef varmistaaksemme, että arvo on yksi odotetuista arvoista lisäämällä merkintöjä:

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

Sama konstruktorin kutsu edellisestä esimerkistä näyttää nyt virheen Android Studiossa, koska nyt se tietää, mitä arvoja odottaa. Katso lisätietoja Androidin virallisesta annotaatio-oppaasta.