有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

解析枚举Java的最佳方法

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

我很长时间都在想这个问题,通常我会想出一些包含几个独立的枚举和函数,以及一些定义之类的东西

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

例如,我试图实现一种包含各种关键字和符号的语言,括号中的数字对应于该元素。Like元素(id)

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

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

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

这样做的目的是,如果输入字符串将输入中的子字符串标识为上面“dictionary”中的元素,那么我可以检查输入字符串以返回整数值

提前谢谢


共 (4) 个答案

  1. # 1 楼答案

    使用^{}创建enum的子集;例如here

  2. # 2 楼答案

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

  3. # 4 楼答案

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

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

    public interface Operators {
    }
    
    public enum BooleanOperators implements Operators {    
       AND, OR, NOT, XOR
    }
    
    public enum ArithmeticOperators implements Operators {
       ADD, SUBTRACT, MULTIPLY, DIVIDE
    }
    

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

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