枚举值构造函数何时评估?在编译时或在程序执行期间 ?编译/运行时Java枚举评估
事实上,我的具体情况而定,甚至比这使我 将在问题展开更加细致入微。
我有一个类,
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 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
不足以确定2个 实例是否相等。
理由
对于那些质疑为什么我的推理是这样的:
与普通的JUnit测试,在这里我们不得不 要么编码知识比较而
“add $ t1,$ t2,$ t3”< - > 0x014b4820
或使InstructionModel
类公开访问以访问 示例(或通过封闭的 类中的方法访问示例),让构造函数评估适当的 模型实例化了相应的数字是值得审慎的。
随后,如果Instruction
构造函数是“错误的”,代码将不会编译。
构造函数执行在运行时。 – EJP
我来实现如何自我回答我的问题。创建一个错误的解析阶段,编译并查看它是否导致任何错误。我必须执行该程序才能遇到任何问题,从而肯定@EJP声明这是一个运行时问题。 –
@FilipAllberg很高兴听到您解决,您可以回答您的问题并与我们分享您所学到的内容......这将使社区更好':)' –