枚举嵌套枚举

5
我希望在Java中为SQL查询创建一个枚举类型的枚举类型。例如,我想说table.create,它将返回CREATE TABLE或database.create,它将返回CREATE DATABASE。我该如何做到这一点?
enum SQL {
    table("ALTER,CREATE"),
    database("CREATE");
}

没有必要重新发明轮子。只需使用 Hibernate 或 myBatis。 - DwB
@DwB 使用第三方库并不总是一个理想的选择。有时它们对你正在开发的项目来说过于复杂。 - Brandon Buck
@PavlosGeorgiou 我在我的答案中添加了一个次要解决方案,它更接近于你所要求的,尽管仍然不是枚举内部的枚举。 - Brandon Buck
2个回答

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枚举。我之前没有看到任何人在另一个枚举内部声明枚举...我几乎喜欢它。


尝试访问特定命令时,可以有点新奇,例如使用类似于 SQL.table.getCommand(Command.CREATE) 的调用来返回 CREATE TABLE 命令? - Brandon Buck
我一直都在使用它!我有包含三层嵌套枚举的情况。代码的清晰度和可用性非常棒! - marcolopes
我真的很喜欢这个答案。嵌套ENUMS! - MAbraham1

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
这也有助于代码的可读性,因为你可以生成像这样的代码:
String query = Table.CREATE + "(Column1 " + DbType.INTEGER + " " + Column.UNIQUE + " " + Column.PRIMARY_KEY + ")";

在我看来,这样会更容易阅读和理解。

编辑

为了尝试接近你想要的效果,你可以做一些类似的事情:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接