Skip to content

Instantly share code, notes, and snippets.

@gbzarelli
Last active April 13, 2018 19:17
Show Gist options
  • Select an option

  • Save gbzarelli/3f4d60dddc3d3d99ae671407679650e1 to your computer and use it in GitHub Desktop.

Select an option

Save gbzarelli/3f4d60dddc3d3d99ae671407679650e1 to your computer and use it in GitHub Desktop.
Anotações Typedef - Use as anotações @IntDef e @stringdef para poder criar anotações enumeradas de conjuntos de números inteiros e strings para validar outros tipos de referência de código. As anotações Typedef garantem que determinado parâmetro, valor de retorno ou campo referencie um conjunto específico de constantes. Elas também permitem que …

Anotações Typedef

Use as anotações @IntDef e @StringDef para poder criar anotações enumeradas de conjuntos de números inteiros e strings para validar outros tipos de referência de código. As anotações Typedef garantem que determinado parâmetro, valor de retorno ou campo referencie um conjunto específico de constantes. Elas também permitem que o preenchimento de código ofereça automaticamente as constantes permitidas. As anotações Typedef usam @interface para declarar o novo tipo de anotação enumerada. As anotações @IntDef e @StringDef, junto com a @Retention, inserem a nova anotação e são necessárias para definir o tipo enumerado. A anotação @Retention(RetentionPolicy.SOURCE) instrui o compilador a não armazenar os dados da anotação enumerada no arquivo .class.

Não utilize ENUM

Cada valor em um ENUM é um objeto e cada declaração terá alguma memória de tempo de execução simplesmente para referenciar o objeto. Portanto, os valores de ENUM terão mais memória do que a constante Integer ou String. Mesmo em dispositivos Android antigos (<= 2,2), houve algum problema de desempenho relacionado ao ENUM que foi resolvido no compilador JIT. Adicionar um único ENUM aumentará o tamanho (13x vezes a constante Integer) do arquivo DEX final. Ele também gera o problema de sobrecarga de tempo de execução e seu aplicativo exigirá mais espaço. Portanto, o uso excessivo de ENUM no Android aumentaria o tamanho da DEX e aumentaria o tamanho da alocação de memória do tempo de execução. Se seu aplicativo estiver usando mais ENUM, é melhor usar constantes Integer ou String em vez de ENUM. O Android fornece uma biblioteca de anotações que possui anotações TypeDef. Essas anotações garantem que um determinado parâmetro, valor de retorno ou campo faça referência a um conjunto específico de constantes. Eles também permitem que o preenchimento de código ofereça automaticamente as constantes permitidas.

IntDef e StringDef são duas Annotation que podem ser usados em vez de Enum. Essas anotações nos ajudarão a verificar a atribuição de variáveis, como Enum, no tempo de compilação.

https://developer.android.com/studio/write/annotations.html?hl=pt-br#enum-annotations https://android.jlelse.eu/android-performance-avoid-using-enum-on-android-326be0794dc3

apply plugin: 'com.android.application'
[...]
dependencies {
[...]
//Adicione a dependencia de anotações da biblioteca de suporte do Android.
implementation 'com.android.support:support-annotations:27.1.0'
}
package br.com.helpdev.swimlapscounter.chronometer
import android.support.annotation.IntDef
class IntDefKotlin {
@ChronometerStatus
private var status: Int = 0
@kotlin.annotation.Retention(AnnotationRetention.SOURCE)
@IntDef(STATUS_A, STATUS_B)
annotation class ChronometerStatus
@ChronometerStatus
fun get(): Int {
return status
}
fun set(@ChronometerStatus x: Int) {
status = x
}
companion object {
const val STATUS_A = 1
const val STATUS_B = 2
}
}
package com.example.gbzarelli.teste;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.IntDef;
import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class MainActivity extends Activity {
@Retention(RetentionPolicy.SOURCE)
@IntDef({LOGIN_ERROR_COMMUNICATION, LOGIN_ERROR_AUTHENTICATION, LOGIN_SUCCESS})
@interface LoginStatus {
}
public static final int LOGIN_ERROR_COMMUNICATION = 1;
public static final int LOGIN_ERROR_AUTHENTICATION = 2;
public static final int LOGIN_SUCCESS = 3;
@LoginStatus
private int loginStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setLoginStatus(LOGIN_ERROR_AUTHENTICATION);
//Erro de compilação, so aceita os valores definidos no IntDef da interface LoginStatus
//setLoginStatus(1);
Log.d("MainActivity", "LOGIN STATUS: " + getLoginStatus());
}
@LoginStatus
public int getLoginStatus() {
return loginStatus;
}
public void setLoginStatus(@LoginStatus int loginStatus) {
this.loginStatus = loginStatus;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment