Substituição de Enums por Anotações EnumeradasEditar PagePage History

Visão Geral

“Constantes Mágicas” ou anotações de tipo são constantes Java antigas decoradas de uma forma que permite que as ferramentas as reconheçam como valores especiais. A sua sintaxe não é diferente de nenhuma outra constante Java. Ao invés disso, uma anotação com um nome facilmente legível que lista todas as constantes relacionadas tem que ser criada.

Esta anotação pode então decorar um valor de retorno ou um parâmetro de método, dando dicas às ferramentas que você usa sobre os valores que são aceitos ou que podem ser esperados. Seu objetivo principal é reforçar a segurança do tipo para parâmetros de método e/ou valores de retorno de método enquanto escreve o código fonte.

Isso é normalmente usado para substituir os enums. O Google desencoraja o uso de enums no desenvolvimento de aplicativos Android, conforme indicado em suas diretrizes para desenvolvedores: “Os enums geralmente requerem mais do dobro de memória que as constantes estáticas. Você deve evitar estritamente o uso de enums no Android”

IntDef

IntDef é uma forma de substituir um enumero inteiro onde há um parâmetro que só deve aceitar valores int explícitos. Por exemplo, suponha que queremos gravar o tipo de um item de alimentação como mostrado abaixo:

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

Direito agora não há validações para garantir que o tipo passado para o construtor é válido. Podemos usar IntDef para garantir que o valor é um dos valores esperados adicionando anotações:

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

A mesma chamada do construtor do último exemplo irá agora mostrar um erro no Android Studio porque agora ele sabe quais os valores a esperar. Consulte o guia oficial de anotações do Android para mais detalhes.

StringDef

StringDef é similarmente uma forma de substituir um enumero de string onde há um parâmetro que só deve aceitar valores de string explícitos. Por exemplo, suponha que queremos registrar o valor para uma configuração como mostrado abaixo:

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

Direito agora não há validações para garantir que o tipo passado para o construtor é válido. Podemos usar StringDef para garantir que o valor é um dos valores esperados adicionando anotações:

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

A mesma chamada do construtor do último exemplo irá agora mostrar um erro no Android Studio porque agora ele sabe quais os valores a esperar. Consulte o guia oficial de anotações do Android para mais detalhes.