values - java enum data type
Java usando enum con declaraciĆ³n de cambio (8)
Ejemplo de función asociativa corta:
public String getIcon(TipoNotificacao tipo)
{
switch (tipo){
case Comentou : return "fa fa-comments";
case ConviteEnviou : return "icon-envelope";
case ConviteAceitou : return "fa fa-bolt";
default: return "";
}
}
Al igual que @Dhanushka dijo, omita el calificador dentro de "cambiar" es la clave.
He visto varias preguntas y respuestas sobre SO similar a esta pregunta, pero no he encontrado una solución.
Lo que tengo es una enumeración que representa diferentes maneras de ver una guía de TV ...
En la clase de Application
NDroid
static enum guideView {
GUIDE_VIEW_SEVEN_DAY,
GUIDE_VIEW_NOW_SHOWING,
GUIDE_VIEW_ALL_TIMESLOTS
}
... cuando el usuario cambia la vista, un controlador de eventos recibe un int
de 0-2 y me gustaría hacer algo como esto ...
En una Activity
Android onClick(DialogInterface dialog, int which)
controlador de eventos
// ''which'' is an int from 0-2
switch (which) {
case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
...
break;
}
Estoy acostumbrado a las enumeraciones de C # y las sentencias de selección / caso que permitirían algo como lo anterior y sé que Java hace las cosas de manera diferente, pero no puedo entender lo que tengo que hacer.
¿Tendré que recurrir a las declaraciones de if
? Es probable que solo haya 3 opciones, así que podría hacerlo, pero me preguntaba cómo se podría hacer con el conmutador en Java.
EDITAR Lo siento, no amplié completamente el tema ya que lo veía como un problema genérico de Java. He agregado la pregunta para explicar un poco más.
No hay nada que sea específico de Android, por eso no lo etiqueté como Android, pero la enumeración se define en la clase de Application
y el código en el que quiero que el interruptor esté en una Activity
. La enumeración es estática ya que necesito acceder a ella desde múltiples actividades.
Esto debería funcionar de la manera que describes. ¿Qué error estás recibiendo? Si pudieras pegar tu código, eso ayudaría.
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
EDITAR: ¿Estás seguro de que quieres definir una enumeración estática? Eso no me suena bien. Una enumeración es muy similar a cualquier otro objeto. Si su código se compila y se ejecuta, pero da resultados incorrectos, probablemente este sea el motivo.
La parte que te falta es la conversión del entero a la enumeración segura de tipos. Java no lo hará automáticamente. Hay un par de formas en que puede hacer esto:
- Use una lista de entradas finales estáticas en lugar de una enumeración segura de tipos y cambie el valor int que recibe (este es el enfoque previo a Java 5)
- Encienda un valor de identificación especificado (como lo describe heneryville ) o el valor ordinal de los valores enum; es decir,
guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
Determine el valor enum representado por el valor int y luego encienda el valor enum.
enum GuideView { SEVEN_DAY, NOW_SHOWING, ALL_TIMESLOTS } // Working on the assumption that your int value is // the ordinal value of the items in your enum public void onClick(DialogInterface dialog, int which) { // do your own bounds checking GuideView whichView = GuideView.values()[which]; switch (whichView) { case SEVEN_DAY: ... break; case NOW_SHOWING: ... break; } }
Es posible que le resulte más útil / menos propenso a errores escribir una implementación de
valueOf
personalizada que tome sus valores enteros como argumento para resolver el valor enum apropiado y le permita centralizar la verificación de límites.
Las enumeraciones no deben calificarse en la etiqueta del caso, como lo que tiene NDroid.guideView.GUIDE_VIEW_SEVEN_DAY
, en su lugar, debe eliminar la calificación y usar GUIDE_VIEW_SEVEN_DAY
Lo estoy haciendo como
public enum State
{
// Retrieving, // the MediaRetriever is retrieving music //
Stopped, // media player is stopped and not prepared to play
Preparing, // media player is preparing...
Playing, // playback active (media player ready!). (but the media player
// may actually be
// paused in this state if we don''t have audio focus. But we
// stay in this state
// so that we know we have to resume playback once we get
// focus back)
Paused; // playback paused (media player ready!)
//public final static State[] vals = State.values();//copy the values(), calling values() clones the array
};
public State getState()
{
return mState;
}
Y uso en la declaración de cambio
switch (mService.getState())
{
case Stopped:
case Paused:
playPause.setBackgroundResource(R.drawable.selplay);
break;
case Preparing:
case Playing:
playPause.setBackgroundResource(R.drawable.selpause);
break;
}
Me gustan algunos usos de Java enum:
- .name () le permite buscar el nombre enum en String.
- .ordinal () le permite obtener el valor entero, basado en 0.
- Puede adjuntar otros parámetros de valor con cada enumeración.
- y, por supuesto, el interruptor habilitado.
enumeración con parámetros de valor:
enum StateEnum {
UNDEFINED_POLL ( 1 * 1000L, 4 * 1000L),
SUPPORT_POLL ( 1 * 1000L, 5 * 1000L),
FAST_POLL ( 2 * 1000L, 4 * 60 * 1000L),
NO_POLL ( 1 * 1000L, 6 * 1000L);
...
}
cambiar el ejemplo:
private void queuePoll(StateEnum se) {
// debug print se.name() if needed
switch (se) {
case UNDEFINED_POLL:
...
break;
case SUPPORT_POLL:
...
break;
Si whichView
es un objeto de GuideView Enum, el siguiente funciona bien. Tenga en cuenta que no hay calificador para la constante después del case
.
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
enumerations accessing is very simple in switch case
private TYPE currentView;
//declaration of enum
public enum TYPE {
FIRST, SECOND, THIRD
};
//handling in switch case
switch (getCurrentView())
{
case FIRST:
break;
case SECOND:
break;
case THIRD:
break;
}
//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
this.currentView = currentView;
}
public TYPE getCurrentView() {
return currentView;
}
//usage of setting the enum
setCurrentView(TYPE.FIRST);
avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always