Vou tentar atualizar o blog com mais frequência com posts menores como este. É um assunto relativamente novo, mas pouco utilizado (e conhecido) pelos desenvolvedores (inclusive eu).
Por questões de performance, é recomendado que evitemos a estrutura "enum" em aplicações Android, substituindo-as por um inteiro (int).
Mas aí sempre vem a pergunta: e como restringir os valores? Por exemplo: digamos que a classe Encomenda possui um atributo chamado status que pode receber apenas os valores "aberto", "em trânsito", "cancelado" e "entregue".
Com as anotações do Android podemos definir uma constante do tipo int para cada status e depois informar no atributo que ele só poderá receber um desses valores.
Para utilizar as anotações do Android, adicione a seguinte dependência no build.gradle.
dependencies {
...
compile 'com.android.support:support-annotations:23.+'
}
Agora vejamos o código a seguir:
class Encomenda {
public static final int STATUS_ABERTO = 0;
public static final int STATUS_EM_TRANSITO = 1;
public static final int STATUS_CANCELADO = 2;
public static final int STATUS_ENTREGUE = 3;
@Retention(RetentionPolicy.SOURCE)
@IntDef({
STATUS_ABERTO,
STATUS_EM_TRANSITO,
STATUS_CANCELADO,
STATUS_ENTREGUE
})
public @interface Status {
}
@Status
public int status;
}
A anotação @Retention indica onde a anotação atuará. No nosso caso, indicamos que ela é usada apenas no processo de compilação. Mas poderíamos utiliza-la em runtime. E com a anotação @IntDef estabelecemos os valores que podem ser utilizados pelo elemento que utilizar essa anotação. Por fim, anotamos o atributo "status" o @Status para restringir os valores que podem ser atribuídos a ele.Desta forma, o código a seguir, daria erro pois 10 não é um valor de status válido:
Encomenda encomenda = new Encomenda(); encomenda.status = 10;Com essa abordagem, você deixa de utilizar as enums e ainda deixa o seu código robusto evitando valores inválidos.
Mas isso é só o começo! A biblioteca de Android Suppport Annotations permite:
- Validar se um parâmetro de método pode ser nulo ou não com @Nullable ou @NonNull;
- Informar com @StringRes que um atributo do tipo int receberá o id de um texto do values/strings.xml;
- Determinar se um método deve executar na main thread (com @UiThread ou @MainThread) ou em uma thread separada @WorkerThread;
- Determinar que uma variável/atributo/método receberá o RGB de uma cor utilizando @ColorInt.
- Informar que uma chamada necessita de uma permissão no AndroidManifest.xml utilizando @RequiresPermission.
E ainda tem muito mais! Mais informações vocês podem encontrar nos links abaixo:
4br4ç05,
nglauber






