枚举内的枚举

发布于 2024-12-14 16:49:20 字数 230 浏览 1 评论 0原文

我想在 java 中的 sql 查询的枚举中创建一个枚举。例如,我想说table.create,它会返回CREATE TABLE或database.create,它会返回CREATE DATABASE。我该怎么做?

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

I want to create an enum within an enum for sql query in java. For example I want to say table.create and it would return CREATE TABLE or database.create and it would return CREATE DATABASE. How can I do this?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三生一梦 2024-12-21 16:49:28

为什么要使其成为枚举中的枚举?

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 + ")";

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

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

With this example, System.out.println(Table.CREATE); prints CREATE TABLE.

This will also aid in readabilty becuase you can produce code like:

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

Which would be a bit easier to read and understand, IMO.

EDIT

To attempt to get close to what you're after you could do something like:

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

Where you can call:

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
じее 2024-12-21 16:49:25

在枚举中定义枚举:

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 枚举。我以前从未见过有人在另一个枚举中声明一个枚举......我几乎喜欢它。

Define an enum within the enum:

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

Although you can do this, it would be better to declare the Command enum in its own class/file. I haven't seen anyone declare an enum inside another enum before... I almost like it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文