Eu costumava definir um conjunto de constantes relacionadas como Bundle
chaves juntas em uma interface como abaixo:
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
Isso me fornece uma maneira mais agradável de agrupar constantes relacionadas e usá-las fazendo uma importação estática (não implementos). Eu sei que o Android
framework também usa as constantes da mesma maneira Toast.LENTH_LONG
, como View.GONE
,.
No entanto, muitas vezes sinto que Java Enums
fornecem uma maneira muito melhor e poderosa de representar a constante.
Mas há um problema de desempenho no uso do enums
on Android
?
Com um pouco de pesquisa, acabei ficando confuso. Desta questão
"Avoid Enums Onde Você Só Precisa de Ints" removida das dicas de desempenho do Android? Está claro que Google
removeu "Avoid enums" de suas dicas de desempenho, mas de seus documentos oficiais de treinamento. Esteja ciente da seção de sobrecarga de memória diz claramente: "Enums freqüentemente requerem mais do que o dobro de memória que constantes estáticas. Você deve evitar estritamente o uso de enums no Android. " Isso ainda é válido? (Digamos nas Java
versões posteriores à 1.6)
Mais uma questão que eu observei é enviar enums
através intents
usando Bundle
devo enviá-los por serialização (ou seja putSerializable()
, que eu acho que uma operação cara em comparação com primitivo putString()
método, eventhoughenums
fornece-lo gratuitamente).
Alguém pode esclarecer qual é a melhor maneira de representar o mesmo em Android
? Devo estritamente evitar o uso enums
de Android
?
Enum.ordinal()
.Respostas:
Use
enum
quando precisar de seus recursos. Não o evite estritamente .Java enum é mais poderoso, mas se você não precisa de seus recursos, use constantes, elas ocupam menos espaço e podem ser primitivas.
Quando usar enum:
sobrecarga de método - cada constante de enum tem sua própria implementação de um método
mais dados - sua única constante contém mais de uma informação que não pode ser colocada em uma variável
Quando não usar enum:
você pode aceitar dados contínuos
Enums ocupam mais espaço
Constantes ocupam menos espaço
fonte
Se os enums simplesmente tiverem valores, você deve tentar usar IntDef / StringDef, conforme mostrado aqui:
https://developer.android.com/studio/write/annotations.html#enum-annotations
Exemplo: em vez de:
você usa:
e na função que o possui como parâmetro / valor retornado, use:
Caso o enum seja complexo, use um enum. Não é tão ruim.
Para comparar enums e valores constantes, você deve ler aqui:
O exemplo deles é um enum com 2 valores. Leva 1112 bytes no arquivo dex em comparação com 128 bytes quando inteiros constantes são usados. Faz sentido, já que enums são classes reais, ao contrário de como funcionam em C / C ++.
fonte
IntDef
anotação, isso acontecerá. Quanto aos relógios, também acho bem claro. Qual dispositivo tem mais CPU, RAM e bateria: um telefone ou um relógio? E quais precisam de software para ser mais otimizado para desempenho por causa disso?Além das respostas anteriores, eu acrescentaria que se você estiver usando o Proguard (e você definitivamente deve fazer isso para reduzir o tamanho e ofuscar seu código), então seu
Enums
será automaticamente convertido para@IntDef
onde for possível:https://www.guardsquare.com/en/proguard/manual/optimizations
Portanto, se você tem alguns valores discretos e algum método deve permitir pegar apenas esses valores e não outros do mesmo tipo, eu usaria
Enum
, pois o Proguard fará esse trabalho manual de otimização de código para mim.E aqui está um bom post sobre o uso de enums de Jake Wharton, dê uma olhada nele.
fonte
Não. " Estritamente " significa que eles são tão ruins que não devem ser usados. Possivelmente, um problema de desempenho pode surgir em uma situação extrema, como muitas, muitas (milhares ou milhões de) operações com enums (consecutivos no encadeamento da interface do usuário). Muito mais comuns são as operações de E / S de rede que devem acontecer estritamente em um thread de segundo plano. O uso mais comum de enums é provavelmente algum tipo de verificação de tipo - se um objeto é este ou aquele que é tão rápido que você não será capaz de notar a diferença entre uma única comparação de enums e uma comparação de inteiros.
Não existe uma regra geral para isso. Use o que funciona para você e ajuda a preparar seu aplicativo. Otimize mais tarde - depois de notar que há um gargalo que retarda alguns aspectos do seu aplicativo.
fonte
Com o Android P, o Google não tem restrição / objeção no uso de enums
A documentação mudou onde antes era recomendado ser cauteloso, mas não o menciona agora. https://developer.android.com/reference/java/lang/Enum
fonte
Dois fatos.
1, Enum é um dos recursos mais poderosos em JAVA.
2, o telefone Android geralmente tem MUITA memória.
Portanto, minha resposta é NÃO. Vou usar Enum no Android.
fonte
Gosto de acrescentar que você não pode usar @Annotations ao declarar uma Lista <> ou Mapa <> onde a chave ou o valor é de uma de suas interfaces de anotação. Você obtém o erro "Anotações não são permitidas aqui".
Portanto, quando você precisar empacotar em uma lista / mapa, use enum, pois eles podem ser adicionados, mas os grupos @annotated int / string não podem.
fonte