【问题标题】:char array used in switch statementswitch 语句中使用的字符数组
【发布时间】:2012-11-15 22:31:39
【问题描述】:

当我说:

时,为什么我的编译器会发疯(需要常量表达式)
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;
                ...

开心吗? 我觉得我在这里很厚。 :-/

【问题讨论】:

  • 除非我弄错了,char[] 是最终的,但内容不是。 IE。你不能说BASES = new char[] { ... },但你仍然可以说BASES[0] = 'X';,所以BASES[0]不是常数。
  • 如果将switch语句的常量放在数组中而不是单独的static final char常量中,目的是什么?在示例中您没有使用数组本身。
  • 我想在其他几个地方使用数组作为数组。它基本上使代码不那么脆弱。不是什么大买卖。只是觉得有点想不通……

标签: java expression constants java-7 primitive


【解决方案1】:

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

【讨论】:

  • 我明白了。我想我已经习惯了某种常量关键字。那么在 Java 中是不可能做到这一点的?
  • 是的,数组无法做到这一点。但是,您可以打开枚举,这在这种情况下可能对您有用。
  • @maccers 我添加了一个示例,说明如何使用枚举来实现相同的目标。
  • @assylias:在你的例子中,考虑到除了getPacked 的一个实现之外的所有实现都只返回了packed,我会将该实现放在基本枚举中并覆盖它just i> 在T
  • @JonSkeet 公平点 - 我这样做是因为我认为每个人在现实世界中都会有所不同(但 OP 没有显示他的所有代码,所以你的评论可能确实适用)。
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多