Ошибка компиляции коммутатора - PullRequest
1 голос
/ 14 ноября 2011

Я смотрел на другие вопросы и до сих пор не могу понять это. Почему он не позволяет мне скомпилировать этот код с помощью оператора switch? Я получаю ошибку, что типичная ошибка "выражения случая должны быть постоянными выражениями". Я пытаюсь включить байт из сообщения. Я хочу использовать переключатель из-за проблем со скоростью и стараюсь не делать никаких преобразований, т. Е. Из int в байт. Мой класс Utils содержит PID перечисления с A, B, C ... в нем. Я хочу включить их, но сообщение, которое я получаю, в байтах.

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

Ответы [ 2 ]

4 голосов
/ 14 ноября 2011

Несмотря на то, что 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;
        }
    }

например. Это не сработает

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;
}
2 голосов
/ 14 ноября 2011

операторы case должны быть константами времени компиляции. Вам необходимо предварительно вычислить (byte) Utils.PID.A.ordinal(); (и две другие константы) и затем жестко закодировать их значения.

...