2011-11-09 47 views
5

我想在java中的sql查询的枚举中创建一个枚举。例如,我想说table.create,它会返回CREATE TABLE或database.create,它会返回CREATE DATABASE。我怎样才能做到这一点?enum中的枚举

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

没有必要重新发明轮子。只需使用Hibernate或myBatis – DwB

+0

@DwB使用第三方库并不总是一个理想的选择。有时候,他们对于你正在开发的项目来说太过分了。 –

+0

@PavlosGeorgiou我在我的答案中添加了第二个解决方案,它与您所要求的内容稍微接近,但仍未在枚举中枚举。 –

回答

1

为什么使它成为一个枚举中的枚举?

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

对于该示例,System.out.println(Table.CREATE);打印CREATE TABLE

这也将有助于readabilty监守你可以产生类似的代码:

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

这将是一个有点易于阅读和理解,IMO。

编辑

,去做你,你可以做这样的事情后,亲近:

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

在这里您可以拨打:

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

定义枚举在枚举中:

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

虽然你可以这样做,最好是在它自己的类/文件中声明Command枚举。我还没有见过任何人在之内声明枚举之前的其他枚举......我几乎喜欢它。

+0

虽然尝试访问特定的命令有点时髦,但像'SQL.table.getCommand(Command.CREATE)'这样的调用返回'CREATE TABLE'? –

+0

非常感谢... –

+0

我一直都在使用它!我有3个嵌套枚举的情况。代码清晰度和使用是惊人的! – marcolopes