枚举Java的最佳方法

Anu*_*er9 5 java enums parsing input

我想知道在Java中枚举的好方法.

我很想知道这一点,通常我想出的东西包括几个独立的枚举和函数,还有一些定义等等.

但基本上,我想为各种类型的枚举定义唯一的数字键,使用子枚举.

例如,我正在尝试在括号中实现一种带有各种关键字和符号的语言,并带有与该元素对应的数字.像元素(id).

关键词:程序(1),调用(2),if(3),else(4),elsif(5),...符号';'(6),','(7),'='(8 ),'+'(9),...操作:和(10),或(11),...

实现这一目标的最佳方法是什么?

我希望我的帖子很清楚.但基本上我正在尝试创建元素类型的类别,然后是元素定义,它们具有关联的数值.

这样做的目的是,我可以检查输入字符串,如果它将输入中的子字符串标识为上面"字典"中的元素,则返回整数值.

提前致谢!

Viv*_*ath 3

您不应该关心枚举本身的数值,也不应该依赖它们。原因是,如果将来您或其他人决定将新的枚举添加到枚举列表的中间,那么您的所有数值现在都无效,您必须仔细检查代码并更改它们。因此,最好依赖于实际的枚举而不是枚举的数值。

如果您尝试将枚举“分组”在一起(如果我正确理解您的问题),您可以使用类似标记界面的东西。例如,您可以:

public interface Operators {
}

public enum BooleanOperators implements Operators {    
   AND, OR, NOT, XOR
}

public enum ArithmeticOperators implements Operators {
   ADD, SUBTRACT, MULTIPLY, DIVIDE
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用一个接受 type 的方法,BooleanOperators而不是使用两种方法,一种接受 type 的枚举,另一种接受 type 的类型:ArithmeticOperatorsOperators

public void doSomethingWithOperators(Operators operators) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

如果您想将显式值绑定到枚举,有一种安全的方法可以做到这一点:

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以执行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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我想这就是你想要的。如果没有,请告诉我!

编辑

Token根据您的评论,我将使用应用于所有枚举的标记接口(我们称之为),然后使用类型的映射Map<String, Token>。您将使用您的令牌和相应的枚举来初始化此映射。当解析器返回标记时,您可以使用映射查找枚举。