如何将枚举声明为一种类型?

时间:2015-01-14 11:45:00

标签: java enums

我正在创建,其中包含一个参数为枚举

的函数
public class Service
{
    public static void setServiceMode(SERVICE_MODE mode)
   {

   }
}

现在,我有一个项目,它正在导入上面的库,并调用" setServiceMode "功能如下

Service.setServiceMode(SERVICE_MODE.LOGIN)

我的问题是在哪里声明枚举(SERVICE_MODE),因为我必须在库函数参数中传递它,而枚举值是项目特定的。 我不想在我的图书馆中进行更改。如何在java中实现这一点?

4 个答案:

答案 0 :(得分:2)

如果可以接受,您可以让图书馆接受任何 enum

public class Service {

    public static <E extends Enum<E>> void setServiceMode(E mode) {

    }

    // Or a pre-generics version.
    public static void setServiceMode2(Enum mode) {

    }
}

public enum SERVICE_MODE {

    LOGIN,
    LOGOUT;
}

public void test() {
    Service.setServiceMode(SERVICE_MODE.LOGIN);
    Service.setServiceMode2(SERVICE_MODE.LOGIN);
}

答案 1 :(得分:1)

SERVICE_MODE将需要包含在两个应用程序共享的库中

答案 2 :(得分:1)

建议使用需要可扩展枚举的接口。以下是设置的概述,为您提供正确的类型约束。在您的库中,定义

interface ServiceMode<E extends Enum<E> & ServiceMode<E>> {}

并将您发布的方法声明为

public static <E extends Enum<E> & ServiceMode<E>> void setServiceMode(E mode) {}

在您的客户端代码中,定义一个枚举:

enum MyServiceMode implements ServiceMode<MyServiceMode> {}

ServiceMode上绑定的类型保证它只能由实现它的枚举参数化,并且传递给setServiceMode的类型的附加约束保证它是ServiceMode的子类型自己参数化。

答案 3 :(得分:0)

除非SERVICE_MODE枚举位于类路径中,否则您的Service类将无法编译。由于这种强烈的依赖性​​,最好的想法是将枚举添加到您的库中。如果你不能这样做,那么创建一个新的库,这将是你的依赖。