【问题标题】:Passing enum types as parameters in java在java中将枚举类型作为参数传递
【发布时间】:2014-02-17 08:41:23
【问题描述】:

我有两种类型的枚举:

public static enum Type1 {
  T1_A,
  T1_B
}

public static enum Type2 {
  T2_A,
  T3_B
}

我希望能够编写一个 API,它可以将这些枚举(Type1Type2)中的任何一个作为参数并对其进行处理。如何设计一种方法,让我在运行时选择枚举的类型?

大意是:

    void fun(?? type1_or_type2) {
         // something goes here...
    }

【问题讨论】:

  • 为什么要投反对票??问题很清楚。至少发表评论。
  • 您认为如何编写一个采用两种不同类型的方法?下面的答案无疑会“起作用”,因为一个通用接口将允许传递任何实现它的东西,但真正的问题是“你为什么要这样做?”
  • @BrianRoach 这就是问题所在 :) 我们也有可能的解决方案。
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 经常告诉别人如何做他们不应该做的事情……是没有用的。

标签: java inheritance enums


【解决方案1】:

您可以创建一个没有方法的标记接口,并让枚举实现该接口。接下来,使用接口作为方法的参数类型。

【讨论】:

    【解决方案2】:

    定义一个接口,并在枚举类中实现该接口。然后使用Interface类型作为参数

    interface Type {
        ...
    }
    
    public static enum Type1 implements Type {
      T1_A,
      T1_B
    }
    
    public static enum Type2 implements Type {
      T2_A,
      T2_B
    }
    
    void fun(Type aType) {
             // something goes here...
        }
    

    【讨论】:

      【解决方案3】:

      或者,这可能是一种查看方法:

      public interface SomeInterface {
          public void interface(Type1 type);
          public void interface(Type2 type);
      }
      

      【讨论】:

      • 从长远来看可能更安全,避免有人实现其他答案中建议的接口。
      【解决方案4】:

      试试这个:

          interface Marker {
      
          }
      
          enum Type1 implements Marker {
              T1_A, T1_B
          }
      
          enum Type2 implements Marker {
              T2_A, T3_B
          }
      
      
          void fun(Marker e) {
          // something goes here...
          if (e instanceof Type1) {
              // Do Type1 specific
          } else if (e instanceof Type2) {
              // Do Type2 specific
          }
      
         }
      

      【讨论】:

      • 我绝对希望避免使用 instanceof,尤其是在有大量枚举可以使用的情况下。
      【解决方案5】:

      您可以将 Enum 类作为参数传递。

      void fun(Class<? extends Enum<?>> yourEnum) {
          // Do something here. Here's how you would get an array of the Enum values.
          yourEnum.getEnumConstants();
      }
      

      你会传入 Type1。

      fun(Type1.class);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多