2016-03-07 72 views
0

我有一個接口FailureReason,我想創建一個實現此接口的枚舉。所以,我有這樣的事情:在Java中的接口switch語句

public enum RemoveSalonFailureReason implements FailureReason { 
    REASON_1, REASON_2; 
} 

然後我想以這種方式來使用它:

public class SalonManager { 

    public String removeSalon(Long salonId) { 
     // some code 
     FailureReason failureReason = result.getFailureReason(); 
     switch (failureReason): 
      case REASON_1: 
       // do sth 
       break; 
      case REASON_2: 
       // do sth 
       break; 
    } 

} 

但我得到一個錯誤「廣東話轉換爲整數」。那我該怎麼做?是否有可能使FailureReason枚舉?像enum FailureReason extends EnumEnum<FailureReason> failureReason = result.getFailureReason()

+9

如果'FailureReason'是一個接口t如果它不能是一個枚舉。如果它是一個枚舉,則不能擴展它。你試圖打開一個編譯器不知道是一個枚舉的變量,所以它會抱怨。嘗試轉換,例如switch((RemoveSalonFailureReason)failureReason)' - 當然你必須知道這種類型 - 爲了在case語句中使用'REASON_1'等,你需要知道哪種類型。 – Thomas

回答

2

A case聲明不能在這裏使用,因爲不是所有的FailureReason都是enum s。

替代方案:

  1. 使用Map<FailureReason,Thing>,看看它,做你的Thing
  2. 只使用一個enum
  3. 使enum做的工作 - 舉例如下。

3實例 -

interface FailureReason { 

    public void doMyThing(); 
} 

public enum RemoveSalonFailureReason implements FailureReason { 
    REASON_1 { 
     @Override 
     public void doMyThing() { 
      System.out.println("You failed!!!"); 
     } 
    }, 
    REASON_2 { 
     @Override 
     public void doMyThing() { 
      System.out.println("You failed AGAIN!!!"); 
     } 
    }; 
} 

請不要訴諸鑄造。

+0

你叫什麼?匿名枚舉? – flakes

+0

@ flkes - 它看起來有點像匿名類,但是這是使用'enum's的一種可接受的方式。 – OldCurmudgeon

+0

我不能使用第三個選項,因爲對結果有不同的反應方式,具體取決於使用的上下文。 – tdudzik

1

像這樣的演員也應該工作。

package general; 

interface FailureReason { 

} 

enum RemoveSalonFailureReason implements FailureReason{ 
    REASON_1, REASON_2; 
} 

public class BasicEnum { 

public static void main(String[] args) { 
    FailureReason failureReason = RemoveSalonFailureReason.REASON_1; 
    switch ((RemoveSalonFailureReason)failureReason){ 
     case REASON_1: 
      System.out.println("Reason 1 is selected"); 
      break; 
     case REASON_2: 
      System.out.println("Reason 2 is selected"); 
      break; 
    } 
} 
} 
0

或者你可以在界面中添加一個吸氣劑;

RemoveSalonFailureReason getSalonFailureReason(); 

而在你RemoveSalonFailureReason您實現像

RemoveSalonFailureReason getSalonFailureReason(){ 
    return this; 
} 

而在你removeSalon方法,吸氣,你可以做

public String removeSalon(Long salonId) { 
    // some code 
    FailureReason failureReason = result.getFailureReason(); 
    switch (failureReason.getSalonFailureReason()): 
     case REASON_1: 
      // do sth 
      break; 
     case REASON_2: 
      // do sth 
      break; 
} 
1

的一種方法是使用泛型:

interface FailureReason<CODE> { 
    public CODE getCode(); 
} 

enum RemoveSalonFailureReason implements FailureReason<RemoveSalonFailureReason> { 
    REASON_1, REASON_2; 

    public RemoveSalonFailureReason getCode() { 
     return this; 
    } 
} 

public static void main(String[] args) { 
    FailureReason<RemoveSalonFailureReason> failureReason = RemoveSalonFailureReason.REASON_1; 
    switch (failureReason.getCode()){ 
     case REASON_1: 
      System.out.println("Reason 1 is selected"); 
      break; 
     case REASON_2: 
      System.out.println("Reason 2 is selected"); 
      break; 
    } 
} 
+0

嗨,只是想知道,代碼是一個特殊的關鍵字,我不知道?因爲該慣例將T用於泛型中的類型。以及在普通界面上使用泛型的好處(如果你檢查我的答案)?歡呼 –

+1

沒有CODE不是特別的,它只比T更具描述性。此實例中的泛型提供了更好的重用性 - 您可以重用FailureReason,而無需將該代碼連接到沙龍,也無需更改FailureReason接口。 – Tom