2016-08-18 176 views
1

枚舉值構造函數何時評估?在編譯時或在程序執行期間 ?編譯/運行時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 構造函數是「錯誤的」,代碼將不會編譯。

+2

構造函數執行在運行時。 – EJP

+0

我來實現如何自我回答我的問題。創建一個錯誤的解析階段,編譯並查看它是否導致任何錯誤。我必須執行該程序才能遇到任何問題,從而肯定@EJP聲明這是一個運行時問題。 –

+0

@FilipAllberg很高興聽到您解決,您可以回答您的問題並與我們分享您所學到的內容......這將使社區更好':)' –

回答

-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 
} 

沒有它影響最終用戶嗎?

+1

沒有「經驗上」或「枚舉值構造函數」或「在這個問題的上下文中」關於它。所有構造函數都在運行時執行。期。 – EJP

+0

我之所以這樣說,是因爲我自己的實驗表明它是這樣的,但這並不意味着我可以單獨推斷它適用於所有構造函數,其次,當我解決我的原始問題時,絕對存在上下文的問題。 Ergo:「雖然我不想這麼做,除非它只是一個編譯時間成本,即我可以在不影響最終用戶的情況下擁有(代碼)嗎?」答案是「不」。我會很樂意地重述它,並提及你更好的判斷。 –

+0

你根本不需要「推斷」它。你可以查看它,或從第一原則中推斷出來。 – EJP