我想知道一种在Java中枚举的好方法。
我很想知道这一点,通常我想出的东西包括几个独立的枚举和函数,还有一些定义等等。
但基本上,我想为各种类型的枚举定义唯一的数字键,并使用子枚举。
例如,我正在尝试在括号中实现一种带有各种关键字和符号的语言,并带有与该元素对应的数字。像元素(id)。
关键字:程序(1),调用(2),if(3),else(4),elsif(5),... 符号';'(6),','(7),'='(8),'+'(9),... 操作:和(10),或(11),......
实现这一目标的最佳方法是什么?
我希望我的帖子很清楚。但基本上我正在尝试创建元素类型的类别,然后是元素定义,它们具有关联的数值。
这样做的目的是,如果输入字符串在输入中将子字符串标识为上面“字典”中的元素,则检查输入字符串以返回整数值。
提前致谢!
答案 0 :(得分:3)
您不应该关心枚举本身的数值,而不应该依赖它们。原因是,如果将来您或其他人决定在枚举列表的中间添加新的枚举,那么您的所有数值现在都无效,您将不得不浏览代码并进行更改。因此,最好依赖实际的枚举而不是枚举的数值。
如果您正在尝试将枚举“分组”在一起(如果我正确理解您的问题),您可以使用类似标记界面的内容。例如,您可以:
public interface Operators {
}
public enum BooleanOperators implements Operators {
AND, OR, NOT, XOR
}
public enum ArithmeticOperators implements Operators {
ADD, SUBTRACT, MULTIPLY, DIVIDE
}
然后,您可以使用一个接受类型BooleanOperators
的方法,而不是使用两个方法,一个接受类型ArithmeticOperators
的枚举,另一个接受Operators
类型的方法:
public void doSomethingWithOperators(Operators operators) {
....
}
如果您想将显式值绑定到枚举,可以采用安全的方法:
public interface Operators {
int getCode();
}
public enum BooleanOperators implements Operators {
private int code;
AND(1), OR(2), NOT(3), XOR(4)
private BooleanOperators(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
}
然后你可以ArithmeticOperators.ADD.getCode()
,它将返回与该枚举相关的代码。此方法更安全,因为您可以看到与枚举显式关联的值与基于其定义顺序隐式关联的值。因此,当您或其他人添加新枚举时,他们应该将一个(希望是唯一的)整数值与新枚举相关联。
注意:在这种情况下,标记界面并非绝对必要;它只是强制要求所有实现接口的枚举应具有getCode()
方法。以下内容同样有效:
public enum BooleanOperators {
private int code;
AND(1), OR(2), NOT(3), XOR(4)
private BooleanOperators(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
}
我认为这就是你想要的。如果没有,请告诉我!
修改强>
根据您的评论,我会使用应用于您所有枚举的标记界面(让我们称之为Token
),然后使用Map<String, Token>
类型的地图。您将使用您的标记和相应的枚举初始化此地图。当您的解析器返回令牌时,您可以使用地图查找枚举。
答案 1 :(得分:1)
答案 2 :(得分:1)
答案 3 :(得分:0)
很好的解决方案,但是当你实现运营商关心他们的优先级时,也可以是enum参数。我的方法是为每个优先级使用单独的组,当我将它们添加到解析器时,我按优先级顺序添加它们。