我已经看过其他问题但仍然无法弄明白。为什么不让它用switch语句编译这段代码?我得到错误,典型的错误“案例表达式必须是常量表达式”。我试图从消息中打开字节。由于速度问题,我想使用开关,并尝试不进行任何转换,即从int到byte。 My Utils类包含一个带有A,B,C ......的枚举PID。我想打开这些,但我收到的消息是以字节为单位。
public class SomeClass extends Thread {
public static final byte myCase1 = (byte) Utils.PID.A.ordinal();
public static final byte myCase2 = (byte) Utils.PID.B.ordinal();
public static final byte myCase3 = (byte) Utils.PID.C.ordinal();
private double[] findAllData(ByteBuffer message) {
byte[] byteBuffer = new byte[9000];
// parse through and find all PIDs
for(int i=0 ;i < message.capacity(); i++) {
message.position(i);
switch (message.get(i)) {
case myCase1 : break; // Compiler errors at the case statements
case myCase2 : break;// Compiler errors at the case statements
case myCase3 : break;// Compiler errors at the case statements
}
}
}
// Utility class
public class Utils {
public enum PID { A,B,C };
}
答案 0 :(得分:4)
即使myCase1
是常量,它也不是编译时已知的常量。
相反,我会打开枚举
private static final Utils.PID[] PIDS = Utils.PID.values();
private double[] findAllData(ByteBuffer message) {
byte[] byteBuffer = new byte[9000];
// parse through and find all PIDs
for (int i = 0; i < message.capacity(); i++) {
message.position(i);
switch (PIDS[message.get(i)]) {
case A:
break;
case B:
break;
case C:
break;
}
}
e.g。这不会起作用
private static final int NUM1 = Integer.getInteger("num1"); // from command line properties
private static final int NUM2 = Integer.getInteger("num2"); // from command line properties
switch(num) {
case NUM1: break;
case NUM2: break;
}
答案 1 :(得分:2)
case语句必须是编译时常量。您需要预先计算(byte) Utils.PID.A.ordinal();
(以及其他两个常量),然后对其值进行硬编码。