0

次のコードがあるとします。

public interface DTMFKeys {

    public String getKeyStr();

    public static enum Sign implements TahoeDTMFKeys {

        SIGN_1("*1"), SIGN_2("*2"), SING_3("*3"), SIGN_4("*4"), SIGN_5("*5"), SIGN_6(
                "*6"), SIGN_7("*7"), SIGN_8("*8"), SIGN_9("*9");

        private String keyStr;

        private Sign(String keyStr) {
            this.keyStr = keyStr;
        }

        @Override
        public String getKeyStr() {
            return keyStr;
        }
    }

    public static enum Pound implements TahoeDTMFKeys {

        POUND_1("1#"), POUND_2("2#"), POUND_3("3#"), POUND_4("4#"), POUND_5(
                "5#"), POUND_6("6#"), POUND_7("7#"), POUND_8("8#"), POUND_9(
                "9#");

        private String keyStr;

        private Pound(String keyStr) {
            this.keyStr = keyStr;
        }

        @Override
        public String getKeyStr() {
            return keyStr;
        }
    }
}

重複したコードを削除するにはどうすればよいですか:

private Sign(String keyStr){
    this.keyStr=keyStr;
}

@Override
public String getKeyStr() {
    return keyStr;
}
4

2 に答える 2

1

コードはそれほど多くないので、リファクタリングする必要はありません。Java 列挙型は他のクラスを拡張できません。コードの重複を避けるということは、getter/setter フィールドではなく、大量の複雑なロジックが繰り返されるということです。

「重複」が本当に心配な場合は、列挙型を完全に廃止できますか?

public static String getKeyString(int n, char sign) {
  if (n < 0 || n > 9) throw new IllegalArgumentException();
  if (sign == '#') {
    return ""+n+sign;
  else if (sign == '*') {
    return ""+sign+n;
  else {
    throw new IllegalAgumentException()
  }
} 

また、SING_3 のスペルが間違っています。

于 2013-02-01T02:23:34.237 に答える
1

これらを削除することは不可能であり、望ましくもありません。列挙型は抽象クラスから継承できないため、不可能です。keyStrは、互いに概念的に独立している Pound クラスと Sign クラスの両方にとってプライベートな概念です。

于 2013-02-01T02:24:41.670 に答える