Como las enumeraciones no son tipos primitivos, ¿cuál es la forma más efectiva de pasar una enumeración a través de una interfaz de ayuda en Android? ¿Hay alguna manera de convertir la enumeración a un ordinal primero?Al pasar enum a través de las interfaces de ayuda
Respuesta
tipos no primitivos, distintos de
String
, requieren un indicador direccional. Los indicadores direccionales incluyenin
,out
yinout
.
Tome un vistazo a la documentación oficial que: http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax
Además, se puede considerar la aprobación de la cadena o la representación ordinal de la enumeración y traducir de nuevo cuando sea necesario. Esto está tomado de la 2ª edición de Java efectiva:
// Implementing a fromString method on an enum type
private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
for (Operation op : values())
stringToEnum.put(op.toString(), op);
} // Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
En el caso anterior, es un Operation
enum
.
Para obtener el ordinal de una enumeración Considere este ejemplo:
public enum Badges{
GOLD, SILVER, BRONZE;
}
// somewhere else:
int ordinal = Badges.SILVER.ordinal();// this should be 1
También deberías evitar las enumeraciones por completo (en un proyecto de Android), si puedes evitarlo. http://developer.android.com/guide/practices/design/performance.html#avoid_enums –
Lamentablemente, no tengo la opción de evitar enumeraciones; este es un proyecto colaborativo. ¿Puedo extraer el ordinal de un valor enum? – Phillip
Sí, puedes. Déjame editar la pregunta. – Cristian
simplemente uso
String enumString = myEnum.name()
(con MyEnum como enumeración y MyEnum como valor) para obtener la representación de String y luego
MyEnum myEnum = MyEnum.valueOf(enumString)
para reconstruir el enum de la representación de Cadena.
El uso de ordinales puede ser un poquito más rápido, pero si puedo agregarlos más tarde, es más probable que se rompa el código anterior.
// Edición: Como no me gusta tener String como tipo de retorno, que ahora se implementa Parcellable como se ha mencionado aquí: Passing enum or object through an intent (the best solution)
importación android.os.Parcel; import android.os.Parcelable;
enum InitResponse implements Parcelable {
// Everything is fine.
SUCCESS,
// Something else
FOO;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(final Parcel dest, final int flags) {
dest.writeString(name());
}
public static final Creator<InitResponse> CREATOR = new Creator<InitResponse>() {
@Override
public InitResponse createFromParcel(final Parcel source) {
return InitResponse.valueOf(source.readString());
}
@Override
public InitResponse[] newArray(final int size) {
return new InitResponse[size];
}
};
}
Ahora terminé combinando este enfoque con la Implementación Parcellable de http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the-best-solution que da como resultado el código editado. encima. – domenukk
- 1. Al pasar primitivas a través de performSelectorOnMainThread
- 2. iteración a través de lista de interfaces
- 3. Pasar objetos identificables a través de las cadenas de constructores
- 4. Pasar una matriz al servicio WCF a través de GET
- 5. reescritura .htaccess pasar todas las cadenas de consulta a través
- 6. django ManyToMany a través de la ayuda
- 7. bucle a través de los valores enum
- 8. Pasar cookie al navegador a través de la intención
- 9. ¿Pasar objeto VB6 al objeto .NET a través de interoperabilidad?
- 10. Al pasar una matriz a través de hidden_field_tag en Rails
- 11. ¿Codificando a las interfaces?
- 12. Comprensión de las interfaces
- 13. Cómo pasar un valor enum al servicio web wcf
- 14. Obteniendo el atributo helptring aplicado a las propiedades de C# expuestas a través de las interfaces COM
- 15. Pasar rvalues a través de std :: bind
- 16. Pasar datos a través de NSTimer UserInfo
- 17. Pasar datos de Python a JavaScript a través de Django
- 18. las variables de pasar al hilo de eventos Despacho
- 19. Importancia de las interfaces C#
- 20. Pasar blob binario a través de un proveedor de contenido
- 21. Existe la posibilidad de pasar incluye a través de -isistema al usar qmake
- 22. Pasar y regresar a ColdFusion Structure a través de JQuery
- 23. pasar argumentos a java a través de horm
- 24. Pasar una instancia de tipo anónimo a través de WCF
- 25. ¿Propósito de las interfaces Zope?
- 26. Pasar datos serializados de JSON a través del campo oculto
- 27. Pasar variables al script de Ruby a través de la línea de comando
- 28. modelo MVC unión a las interfaces
- 29. ¿Equivalente a las interfaces Java en C++?
- 30. Cómo pasar ENUM como argumento de función en C
Eche un vistazo al comentario de Charlie Collins. Eso es completamente cierto: evita las enumeraciones tanto como sea posible. – Cristian
@ Christian que debe tomarse con un grano de sal. las enumeraciones son un buen diseño. hay una razón por la que Android no elimina las enumeraciones del idioma. –
Eso es cierto amigo. Sin embargo, creo que no lo movieron porque no es tan fácil. Todavía usan 'javac' antes de dexing el bytecode. De todos modos ... me encantan las enumeraciones, y las uso cuando hacen las cosas claras y elegantes. – Cristian