3

次のように言うと、コンパイラが怒ってしまうのはなぜですか (定数式が必要です)。

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

それは幸せですか?私はここで太っているように感じます。:-/

4

1 に答える 1

4

aの引数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);
}
于 2012-11-15T22:35:37.283 に答える