我试图用谷歌搜索,但是没有运气。
我的开关很大,有些情况 显然 比其他情况 更常见 。
因此,我想知道订单是否真正保持原状,并且在“下”之前先测试“上”案例,因此可以更快地进行评估。
我想保留订单,但是如果它影响速度,那么重新排序分支将是一个好主意。
例如:
switch (mark) { case Ion.NULL: return null; case Ion.BOOLEAN: return readBoolean(); case Ion.BYTE: return readByte(); case Ion.CHAR: return readChar(); case Ion.SHORT: return readShort(); case Ion.INT: return readInt(); case Ion.LONG: return readLong(); case Ion.FLOAT: return readFloat(); case Ion.DOUBLE: return readDouble(); case Ion.STRING: return readString(); case Ion.BOOLEAN_ARRAY: return readBooleans(); case Ion.BYTE_ARRAY: return readBytes(); case Ion.CHAR_ARRAY: return readChars(); case Ion.SHORT_ARRAY: return readShorts(); case Ion.INT_ARRAY: return readInts(); case Ion.LONG_ARRAY: return readLongs(); case Ion.FLOAT_ARRAY: return readFloats(); case Ion.DOUBLE_ARRAY: return readDoubles(); case Ion.STRING_ARRAY: return readStrings(); default: throw new CorruptedDataException("Invalid mark: " + mark); }
对switch语句重新排序没有任何效果。
查看Java字节码规范,switch可以将a编译为a lookupswitch或一条tableswitch指令,然后打开a int。A lookupswitch总是以可能的值以已排序的顺序进行编译,因此对代码中的常数进行重新排序将无关紧要,而tableswitchjust则具有相对于指定偏移量的可能跳转数组,因此,它也不必关心原始顺序。
switch
lookupswitch
tableswitch
int
请参阅http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitch和http://docs.oracle.com/javase/specs/jvms/se7 /html/jvms-6.html#jvms-6.5.tableswitch了解详情。