繁体   English   中英

枚举Java的最佳方法

[英]Best way to Enumerate Java

我想知道一个枚举Java的好方法。

我已经想了很久了,通常我会提出一些东西,其中包括几个独立的枚举和函数,以及一些定义等。

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

例如,我正在尝试使用括号中的各种关键字和符号(具有与该元素相对应的数字)来实现一种语言。 类似于element(id)。

关键字:program(1),call(2),if(3),else(4),elsif(5),...符号';'(6),','(7),'='(8 ),'+'(9),...操作:和(10),或(11),...

做到这一点的最佳方法是什么?

希望我的帖子清楚。 但基本上,我试图创建元素类型的类别,然后创建其中具有关联数值的元素定义。

这样做的目的是,使我可以检查输入字符串以返回整数值(如果该字符串将输入中的子字符串标识为上述“字典”中的元素)。

提前致谢!

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

如果您试图将枚举“分组”在一起(如果我正确理解了您的问题),则可以使用标记界面之类的方法。 因此,例如,您可能有:

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>类型的Map<String, Token> 您将使用令牌和相应的枚举来初始化此映射。 当解析器返回令牌时,您可以使用地图查找枚举。

使用EnumSet创建enum子集; 一个例子可以在这里找到。

好的解决方案,但是当您实现运算符时,它会关心它们的优先级,这也可以是enum参数。 我的方法是为每个优先级使用单独的组,当我将它们添加到解析器时,我会按优先级顺序添加它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM