枚举值构造函数何时评估?在编译时或 在程序执行期间?
事实上,我的具体案例可能比这更具细微差别 我将扩展这个问题。
我有一个班级,
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
,代码将无法编译
构造函数是“错误的”。
答案 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 }
没有它影响最终用户?
没有