枚舉值構造函數何時評估?在編譯時或在程序執行期間 ?編譯/運行時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很高興聽到您解決,您可以回答您的問題並與我們分享您所學到的內容......這將使社區更好':)' –