2011-12-12 9 views
28

Si tuviera una clase en Java como esto:¿Utiliza enums de Java de diferentes clases?

public class Test 
{ 
    // ... 
    public enum Status { 
     Opened, 
     Closed, 
     Waiting 
    } 
    // ... 
} 

Y tuve una clase diferente en un archivo de clase diferente (pero en el mismo proyecto/carpeta):

public class UsingEnums 
{ 
    public static void Main(String[] args) 
    { 
     Test test = new Test(); // new Test object (storing enum) 

     switch(test.getStatus()) // returns the current status 
     { 
      case Status.Opened: 
       // do something 
      // break and other cases 
     } 
    } 
} 

que efectivamente lo haría tener una enumeración en una clase que se usa en otra clase (en mi caso, específicamente en una declaración de cambio de mayúscula).

Sin embargo, cuando lo hago, me sale un error como:

no puede encontrar el símbolo - Estado de clase

¿Cómo voy a arreglar eso?

+2

Todas las respuestas parecían correctas, pero cuando lo hice comenzó a dar el error 'una etiqueta enum switch case debe ser el nombre no calificado de una constante de enumeración' y encontré eso simplemente eliminando todo frente al estado ('Status.Opened' se convirtió en' Abierto') lo arregló. – Bhaxy

Respuesta

77

Un interruptor enumeración debe ser el sin reservas nombre de una constante de enumeración:

switch (test.getStatus()) // returns the current status 
{ 
    case Opened: 
     // do something 
     // break and other cases 
} 

No importa que está definido dentro de otra clase. En cualquier caso, el compilador puede inferir el tipo de enumeración según su declaración switch, y no necesita los nombres constantes para calificar. Por alguna razón, el uso de nombres calificados es sintaxis no válida.

Este requisito se especifica por JLS §14.11:

SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

(Gracias a Mark Peters related post para la referencia.)

+4

Votando - Aprendí algo nuevo hoy ... –

+1

@AmirAfghani - Casi fui por la misma ruta, si miras mi historial de edición :) Afortunadamente lo probé y recordé sobre enums. –

+1

Due diligence * does * pay off;) –

2

NVM

Tiene que ser totalmente no calificado, la calificación es dada por el tipo de la variable switch() ed (en este caso test.getStatus(), que es un Test.Status).


Su Enum Status es una parte de su class Test. Como tal, es necesario calificarla: etiqueta de la caja

Test test = new Test(); // new Test object (storing enum) 

    switch(test.getStatus()) // returns the current status 
    { 
     case Test.Status.Opened: 
      // do something 
     // break and other cases 
    } 

2

A medida que la enumeración Status se incluye en la clase Test es necesario utilizar Test.Status vez de solo Status.

1

Las enumeraciones son (más o menos) solo clases como cualquier otra, por lo que las reglas aquí son las mismas que para otras clases internas. Aquí probablemente quieras declarar la clase enum como static: no depende de los miembros de su clase adjunta. En ese caso, Test.Status.Opened sería una forma correcta de referirse a él. Si realmente no quiere decir que la clase es estática, probablemente necesite usar una instancia como el calificador de "espacio de nombres", es decir, test.Status.Opened.

Editar: Aparentemente las enumeraciones son implícitamente estáticas. Esto tiene algún sentido dado lo que se supone que es una enumeración, pero probablemente sea buena forma de declararlos como estáticos explícitamente.

10

Si sus getStatus() retornos en realidad un Status su caso deben ser:

case Opened: 

Si intenta:

case Test.Status.Opened: 

su IDE le dará un error como:

an enum switch case label must be the unqualified name of an enumeration constant 
0

Pruebe con este ejemplo

switch(test.getStatus()) { 

    case FILE : 
      fullList.addAll(getFileMensionList(session, search, authUser)); 
      break; 
    case EVENT : 
      fullList.addAll(getEventMensionList(session, search, authUser)); 
      break; 
    case POLL : 
      fullList.addAll(getPollMensionList(session, search, authUser)); 
      break; 
    case PROJECT : 
      fullList.addAll(getProjectMensionList(session, search, authUser)); 
      break; 
    case TASK : 
      fullList.addAll(getTaskMensionList(session, search, authUser)); 
      break; 
} 
1

que habían declarado una enumeración en mi clase de la siguiente manera:

MyBinaryTree public class {

private Node root; 
public enum ORDER_TYPE { 
    IN_ORDER, POST_ORDER, 
}; 

    public void printTree(ORDER_TYPE order) { 
    //Printing tree here 
    } 

}

y yo estaba tratando de acceder a este en una clase diferente

clase pública Solution1 {

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    MyBinaryTree myTree = new MyBinaryTree(); 
      myTree.printTree(myTree.ORDER_TYPE.POST_ORDER); 
    } 

}

El problema aquí es si uso un objeto instancia para acceder a la ORDER_TYPE enumeración recibo un error de tiempo de compilación: "ORDER_TYPE no se puede resolver o no es un campo"

yo nos registramos de nuevo y cambiado mi código para utilizar directamente el nombre de clase como el nombre calificador

public static void main(String[] args) { 
MyBinaryTree myTree = new MyBinaryTree(); 
myTree.printTree(MyBinaryTree.ORDER_TYPE.POST_ORDER); 
} 

Esto resolvió el problema - creo que cada vez que estamos utilizando la enumeración de una clase en otra - hay que acceder a él a través de los CLAS s como un método estático.

Cuestiones relacionadas