二维枚举

Two dimensional enum

二维枚举在java中是一回事吗?即:

public enum Modules {
    ATTACK(enum States{IDLE, NEAREST, NEARESTTOHQ;}),
    MOVE(enum States{IDLE, NORTH, SOUTH, EAST, WEST;}),
    SPAWN(enum States{IDLE, SIMPLESPAWN;});
}

简而言之,没有。根据 the JLS:

An enum constant defines an instance of the enum type.

因此每个枚举常量,因为它是枚举类型,不能包含新的嵌套成员声明。您可以将所有 3 个 "sub" 枚举定义为枚举的嵌套成员,然后像这样访问它们:

Modules.AttackOptions.IDLE

按照相同的逻辑(并且 JLS 允许这样做)枚举常量也可以包含对抽象或默认方法的覆盖,并拥有它们自己的 "state",如下所示:

public enum Modules {
    ATTACK(0, 1, 2) { public int getCost() { return 2;} },
    MOVE  (3, 4, 5) {  }, // no method override
    SPAWN (6, 7)    { public int getCost() { return 1000;} };

    private final int[] vars;
    private Modules(int... vars) { this.vars = vars; }
    public int getCost() { return 1; }
    public int[] getVars() { return this.vars; }

    public enum AttackOptions {
        IDLE, NEAREST, SPAWN
    }
}

我不太理解你想做什么,但这样做可以吗?

enum States {
    IDLE, NEAREST, NEARESTTOHQ,NORTH,SOUTH,EAST,WEST,IDLESPAWN
}

public enum Modules {
    ATTACK(IDLE, NEAREST, NEARESTTOHQ),
    MOVE(IDLE, NORTH, SOUTH, EAST, WEST),
    SPAWN(IDLE, SIMPLESPAWN);

    private States[] states;

    public Modules(States... states) {
        this.states=states;
    }
}

(请注意,要获得我使用的语法,我相信您需要将 States 放入它自己的文件中,并在模块中包含导入 States.*)

不是你想的那样,但这可以更直接地完成。

如果这些枚举能够容纳 States 的数组,您可以在声明时设置它们的已知状态。

示例:

public enum Modules {
    ATTACK(States.IDLE, States.NEAREST, States.NEARESTTOHQ),
    MOVE(States.IDLE, States.NORTH, States.SOUTH, States.EAST, States.WEST),
    SPAWN(States.IDLE, States.SIMPLESPAWN);

    private final States[] knownStates;

    private Modules(States... knownStates) {
        this.knownStates = knownStates;
    }

    public States[] getKnownStates() {
        return knownStates.clone();
    }
}