二维枚举
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();
}
}
二维枚举在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();
}
}