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

标签 java enums generics

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

最佳答案

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

为此,请使用 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);

一般来说,使用枚举作为方法参数的参数类型是完全可以的。

更新

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

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

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

就代码而言(出于演示目的,大大简化并有些做作):

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) {
          ...
       }
   }       
}

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

关于java - 如何将不同的枚举类型传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718119/

相关文章:

Java 泛型 : Class that takes a class that takes another class

java - 如何在 testng 工厂类中使用 spring Autowiring

java - 如何在 OSGi 框架停止之前销毁所有 OSGi 蓝图组件?

c++ - 关于强类型枚举前向声明

java - 枚举和开关帮助。 Java学习者

java - 如何使方法返回类型通用?

java - 创建一个重复循环,以便程序会询问用户是否需要另一个条目,直到用户指示 “No.”

java - RecyclerView适配器连接错误: no adapter attached

java - 为什么使用静态枚举?

c# - 当我期望它选择非泛型方法时,方法重载选择了泛型方法