编译/运行时的Java枚举评估

时间:2016-08-18 09:51:01

标签: java enums compile-time

枚举值构造函数何时评估?在编译时或 在程序执行期间?

事实上,我的具体案例可能比这更具细微差别 我将扩展这个问题。

我有一个班级,

class Instruction

private enum

private enum InstructionModel

其中InstructionModel作为原型示例 说明。一个简单的视图将是

private enum InstructionModel {
    ADD("add $t1, $t2, $t3", 0x014b4820, // Other params
            ),
    ;

    // Some stuff

    InstructionModel(String example, int sameExample, // Other params
                            ) {
        // Some other stuff
    }

现在,封闭类(Instruction)可以创建实例 它本身来自字符串和数字,即

class Instruction {
    Instruction fromNumber(int number) {
        // ...
    }

    Instruction fromString(String mnemonic) {
        // ...
    }

    private enum InstructionModel { ... }
}

所以,

Instruction foo = Instruction.fromNumber(0x014b4820);
Instruction bar = Instruction.fromString("add $t1, $t2, $t3");
assert(foo.equals(bar));

现在,我可以打开Instruction API,以便我可以从我的 单元测试访问编码到InstructionModel

中的示例

但是:(假设我的理解是正确的)因为枚举 构造函数只执行一次,我可以让值 构造函数验证String示例是否产生了 数字表示,反之亦然。

虽然,我不想这样做,除非它只是一个编译时 成本。即我能不能

InstructionModel(String example, int sameExample, // Other params
                        ) {

    Instruction foo = Instruction.fromNumber(0x014b4820);
    Instruction bar = Instruction.fromString("add $t1, $t2, $t3");
    assert(foo.equals(bar));

    // Some other stuff
}

没有它影响最终用户?

注意

在此背景下,以下操作至关重要

Instruction foo = Instruction.fromNumber(0x014b4820);
Instruction bar = Instruction.fromString("add $t1, $t2, $t3");
assert(foo.equals(bar));

因为InstructionModel不足以确定是否两个 实例是平等的。

原理

对于那些质疑为什么的人,我的推理是这样的:

与简单的JUnit测试相比,我们必须这样做 要么编码

的知识
  

“添加$ t1,$ t2,$ t3”< - > 0x014b4820

或公开访问InstructionModel课程 示例(或通过封闭中的方法访问示例 ()让构造函数评估它是正确的,这是谨慎的 model被实例化为相应的数字。

随后,如果Instruction,代码将无法编译 构造函数是“错误的”。

1 个答案:

答案 0 :(得分:-1)

构造函数在运行时进行评估。这意味着 以下代码段,

InstructionModel(String example, int sameExample, // Other params
                        ) {

    Instruction foo = Instruction.fromNumber(0x014b4820);
    Instruction bar = Instruction.fromString("add $t1, $t2, $t3");
    assert(foo.equals(bar));

    // Some other stuff
}

在运行时进行评估。它是一个枚举构造函数并不重要。因此,只有在使用构造函数时才会对其进行评估。

  

虽然,我不想这样做,除非它只是编译时的成本。即我能不能

InstructionModel(String example, int sameExample, // Other params
                        ) {

    Instruction foo = Instruction.fromNumber(0x014b4820);
    Instruction bar = Instruction.fromString("add $t1, $t2, $t3");
    assert(foo.equals(bar));

    // Some other stuff
}
     

没有它影响最终用户?

没有