2011-02-08 15 views
5

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

+0

Eche un vistazo al comentario de Charlie Collins. Eso es completamente cierto: evita las enumeraciones tanto como sea posible. – Cristian

+0

@ 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. –

+0

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

Respuesta

5

tipos no primitivos, distintos de String, requieren un indicador direccional. Los indicadores direccionales incluyen in, out y inout.

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 Operationenum.


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 
+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 –

+0

Lamentablemente, no tengo la opción de evitar enumeraciones; este es un proyecto colaborativo. ¿Puedo extraer el ordinal de un valor enum? – Phillip

+0

Sí, puedes. Déjame editar la pregunta. – Cristian

7

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

} 
+1

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

Cuestiones relacionadas