如何将不同的枚举类型传递给方法?

时间:2011-01-17 21:30:50

标签: java enums generics

我有一个方法,它采用枚举并以某种方式使用它。问题是我有许多不同的枚举类型,并不是将枚举传递给方法的可接受的做法。

1 个答案:

答案 0 :(得分:13)

我假设你的意思是你有一堆不同的枚举类意味着分开的东西,并且你想将它们传递给一个方法。

为此,请使用marker interface

public interface SpecialEnumType {
}

然后:

public enum MySpecialEnumType implements SpecialEnumType {
  ...
}

public enum AnotherSpecialEnumType implements SpecialEnumType {
  ...
}

现在,您的方法将接受SpecialEnumType类型的参数:

public doSomething(SpecialEnumType specialEnumType) {
  ...
}

完成后,你可以这样做:

obj.doSomething(MySpecialEnumType.SomeThing);
obj.doSomething(AnotherSpecialEnumType.SomethingElse);

一般来说,将enum用作方法参数的参数类型是完全可以的。

<强>更新

我在与第三方API集成时使用了这种模式。例如,不久前我不得不与不同的运输供应商整合。为此,我提供了一个通用界面,允许开发人员发送运输信息(如地址,包裹,重量,包装选项等)。如果您想实现与新提供的集成,您需要做的就是实现接口。

现在每家运输提供商都有自己的一套选择。在使用标记界面之前,我有一个包含所有选项的枚举(所有不同的运送提供商)。这显然很难维持。但是我无法将枚举分成不同的类,因为接口为方法参数指定了特定类型的枚举。

使用标记界面,我能够解决这个问题。我创建了一个名为ShippingProviderOption的接口。然后,对于每个提供程序,我扩展了接口并创建了一个枚举,其中包含该提供程序的特定选项。通过这种方式,我能够分离出选项,但仍然提供了一个通用界面。

就代码而言(为了演示目的而大大简化和有些人为):

public interface ShippingProviderOption {
}

public enum UPSOption implements ShippingProviderOption {
    ...
}

public enum FedexOption implements ShippingProviderOption {
    ...
}

public interface ShippingProvider {

   public ShippingResponse ship(ShippingProviderOption option);
}

public class UPSProvider implements ShippingProvider {

   @Override
   public ShippingResponse ship(ShippingProviderOption option) {

       if(option == UPSOption.PackageType) {
          ...
       }
   }       
}

public class FedexProvider implements ShippingProvider {

   @Override
   public ShippingResponse ship(ShippingProviderOption option) {

       if(option == FedexOption.PickupType) {
          ...
       }
   }       
}

现在在我的实际实现中,我在标记界面中有一些方法。所以它甚至不必是标记接口;它可以包含方法。