2013-02-01 127 views
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; 
} 
+2

你不能,真的,但它不是好像它是那麼多的代碼。 –

+0

你可以讓基類成爲'abstract'類而不是接口嗎?還是不允許? –

+0

@KarthikT:如果您使用的是枚舉,則不適用。 –

回答

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拼寫錯誤。

1

這是不可能也不可取的。因爲枚舉不能從抽象類繼承,所以不可能。 keyStr是一個私人的概念,這兩個概念都是相互獨立的Pound和Sign類。