2012-11-15 3 views
3

Почему мой компилятор злиться (Constant выражение требуется), когда я говорю:массив символов используется в переключатель заявлении

final static char [] BASES = new char[]{'A', 'T', 'C', 'G'}; 
. 
. 
     char c= in.charAt(i); 
      switch(c){ 
       case BASES[0] : break; 
       case BASES[1] : packed =(char) (packed | 1); break; 
       . 
       . 
       . 
      } 

, но если я говорю:

final static char a ='A'; 
final static char t ='T'; 
     switch(c){ 
       case a : break; 
       ... 

он счастлив? Мне кажется, что я здесь толстый. : -/

+1

Если я не ошибаюсь, то 'символ []' является окончательным, но содержание не являются. То есть вы не можете сказать 'BASES = new char [] {...}', но вы все равно можете сказать 'BASES [0] = 'X';', поэтому 'BASES [0]' не является константой. – Blorgbeard

+0

Какова цель, если существуют константы для случая оператора switch в массиве, а не в отдельных константах статического конечного символа? Вы не используете сам массив в примере. – Reboot

+0

Я хотел бы использовать массив в нескольких других местах как массив. Это в основном делает код немного менее хрупким. Не массовое дело. Я просто чувствовал себя немного толстым, неспособным понять это ... – maccers

ответ

4

Аргумент case должен быть константой, то есть константной или строковой константой или литералом или константой перечисления. Ваш массив постоянный, но не его содержимое ...

В вашем случае будет указано перечисление, а приведенный ниже код - пример того, как вы могли его написать. Он ставит всю логику, связанную с базами в перечислении, которые вы теперь можете использовать повторно, где вам нужно - вы можете добавлять методы тоже. И основной код теперь чист и легко читается.

Главный код:

public static void main(String[] args) { 
    String input = "ATC"; 
    char packed = 0; 
    for (char c : input.toCharArray()) { 
     Base base = Base.valueOf(String.valueOf(c)); 
     packed = base.getPacked(packed); 
    } 
} 

И ваше перечисление будет выглядеть следующим образом:

public enum Base { 

    A { 
     public char getPacked(char packed) { 
      return packed; 
     } 
    }, T { 
     public char getPacked(char packed) { 
      return (char) (packed | 1); 
     } 
    }, C { 
     public char getPacked(char packed) { 
      return packed; 
     } 
    }, G { 
     public char getPacked(char packed) { 
      return packed; 
     } 
    }; 

    public abstract char getPacked(char packed); 
} 
+0

Я вижу. Я полагаю, что я привык иметь какое-то постоянное ключевое слово. Значит, это невозможно сделать в Java? – maccers

+0

Да, это невозможно сделать с помощью массивов. Однако вы можете включить перечисления, которые могут вам пригодиться в этом сценарии. – Sbodd

+0

@maccers Я добавил пример того, как вы могли бы использовать перечисление для достижения той же цели. – assylias

Смежные вопросы