gpt4 book ai didi

C 枚举的 Java 表示

转载 作者:行者123 更新时间:2023-12-02 18:10:16 25 4
gpt4 key购买 nike

我正在将用 C 编写的字节码编译器移植到 Java。在 C 实现中,操作集用枚举表示:

typedef enum {
SOME_OP,
ANOTHER_OP,
//Etc.
} Operations;

然后,运算与数组中的数字参数混合,定义如下:

uint8_t* opsAndArgs;

例如,opsAndArgs 可能包含:

{SOME_OP, 42, ANOTHER_OP, 99, 03, DIFFERENT_OP, RANDOM_OP, 14, etc.}

最后,C 程序中的函数迭代 opsAndArgs 并打开运算符,根据需要使用参数:

int i = 0;

while (i < opsAndArgs.length) {
switch (opsAndArgs[i] {
case SOME_OP:
handleSomeOp(opsAndArgs[i+1]);
i = i + 2; break;
case ANOTHER_OP:
handleAnotherOp(opsAndArgs[i+1], opsAndArgs[i+2]);
i = i + 3; break;
case DIFFERENT_OP:
handleDifferentOp();
i = i + 1; break;
Etc.
}
}

有没有办法在 Java 中做同样的事情?即,创建一个枚举,我可以将其混合到具有数值的数组中,并且仍然能够打开枚举定义的运算符,同时将其余值视为参数?

原始程序似乎利用了 C 枚举的某些功能,以便它们可以与 uint8_t 值混合。

最佳答案

与 C 语言不同,Java 中的枚举是一个对象。这意味着将它们与数字混合的唯一方法是使用 List<Object>Object[] .

每个枚举都有一个 ordinal()值是一个 int。但这些不是编译时常量,因此您不能在 switch 语句中使用它们*。

我认为你有一些选择:

  1. 选择 List<Object>/Object[]解决方案。如果您只执行切换操作,则可以通过 instanceof 的组合来完成此操作。和switch
if (opsAndArgs[i] instanceof Operation operation) { // **
switch (operation) {
case SOME_OP: ...
}
}
  • 忘记枚举并使用常量类:
  • final class Operation {
    public static final int SOME_OP = 1;
    // etc

    private Operation() {}
    }
  • 为每个枚举常量定义 int 常量。每个枚举常量必须返回其中之一,并且您需要对枚举类进行查找(静态方法)以根据 int 常量查找枚举常量。不要相信ordinal()作为常量,因为如果更改枚举常量的顺序,序数值也会更改。
  • 我认为您必须问自己的主要问题是:您需要一个枚举吗?或者常量类足够好吗?因为这绝对是更简单的解决方案。

    * 还没有?我还没有完全了解开关模式匹配的最新变化...

    ** 这是 Java 16 中最终确定的语法。在旧版本中,使用 opsAndArgs[i] instanceof Operation与 if 内的新变量结合使用: Operation operation = (Operation) opsAndArgs[i];

    关于C 枚举的 Java 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72501348/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com