2016-03-07 82 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