2011-11-09 7 views
5

Quiero crear una enumeración dentro de una enumeración para la consulta sql en java. Por ejemplo, quiero decir table.create y devolvería CREATE TABLE o database.create y devolvería CREATE DATABASE. ¿Cómo puedo hacer esto?Enum dentro de la enumeración

enum SQL { 
    table("ALTER,CREATE"), 
    database("CREATE"); 
} 
+0

No hay necesidad de reinventar la rueda. Solo use Hibernate o myBatis – DwB

+0

@DwB Usar bibliotecas de terceros no siempre es una opción deseable. A veces son excesivos para el proyecto en el que estás trabajando. –

+0

@PavlosGeorgiou Agregué una solución secundaria a mi respuesta, está un poco más cerca de lo que estás preguntando aunque todavía no enum dentro de enum. –

Respuesta

1

Why make it an enum within an enum?

Table.java

public enum Table { 
    CREATE("CREATE TABLE"), 
    ALTER("ALTER TABLE"); 

    private String cmd; 

    Table(String cmd) { 
     this.cmd = cmd; 
    } 

    @Override 
    public String toString() { 
     return cmd; 
    } 
} 

Database.java

public enum Database { 
    CREATE("CREATE DATABASE"); 

    private String cmd; 

    Database(String cmd) { 
     this.cmd = cmd; 
    } 

    @Override 
    public String toString() { 
     return cmd; 
    } 
} 

Con este ejemplo, System.out.println(Table.CREATE); impresiones CREATE TABLE.

Esto también ayudará en readabilty becuase se puede producir un código como:

String query = Table.CREATE + "(Column1 " + DbType.INTEGER + " " + Column.UNIQUE + " " + Column.PRIMARY_KEY + ")"; 

lo que sería un poco más fácil de leer y entender, la OMI.

EDITAR

Para tratar de acercarse a lo que está buscando usted podría hacer algo como:

public enum SQL { 
    TABLE("TABLE", SQL.CREATE_FLAG | SQL.ALTER_FLAG), 
    DATABASE("DATABASE", SQL.CREATE_FLAG); 

    public static final int CREATE_FLAG = 1; 
    public static final int ALTER_FLAG = 2; 

    public static final String CREATE_STRING = "CREATE"; 
    public static final String ALTER_STRING = "ALTER"; 

    public static final String INVALID = "INVALID"; 

    private String name; 
    private boolean create; 
    private boolean alter; 

    SQL(String name, int flags) { 
     create = (flags & CREATE_FLAG) != 0; 
     alter = (flags & ALTER_FLAG) != 0; 

     this.name = name; 
    } 

    public String create() { 
     if (create) 
      return CREATE_STRING + " " + name; 
     else 
      return INVALID; 
    } 

    public String alter() { 
     if (alter) 
      return ALTER_STRING + " " + name; 
     else 
      return INVALID; 
    } 
} 

Donde se puede llamar:

System.out.println(SQL.TABLE.create()); // CREATE TABLE 
System.out.println(SQL.TABLE.alter());  // ALTER TABLE 
System.out.println(SQL.DATABASE.alter()); // INVALID 
System.out.println(SQL.DATABASE.create()); // CREATE DATABASE 
9

Definir una enumeración dentro de la enumeración:

public static enum SQL { 
    table(Command.ALTER,Command.CREATE), 
    database(Command.CREATE); 
    public static enum Command { 
     CREATE, 
     ALTER 
    } 
    private final Command[] commands; 
    private SQL (Command... commands) { 
     this.commands = commands; 
    } 
    public Command[] getCommands() { 
     return commands; 
    } 
} 

Aunque puede hacer esto, sería mejor declarar el Comando enum en su propia clase/archivo. No he visto a nadie declarar una enumeración dentro de otra enumeración antes ... Casi me gusta.

+0

Simplemente sea un poco raro tratando de acceder a un comando específico, con una llamada como 'SQL.table.getCommand (Command.CREATE)' para devolver 'CREATE TABLE' –

+0

Muchas gracias ... –

+0

¡Lo uso todo el tiempo! Tengo casos de 3 enumeraciones anidadas. La claridad y el uso del código es increíble! – marcolopes

Cuestiones relacionadas