2016-08-18 103 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