2015-01-14 2 views
0

Я создаю библиотеку, которая включает в себя функцию, имеющую аргумент перечислимогоКак объявить перечисление как тип?

public class Service 
{ 
    public static void setServiceMode(SERVICE_MODE mode) 
    { 

    } 
} 

Теперь у меня есть проект который импортирует выше библиотеку, и назвав «setServiceMode» функция следующим

Service.setServiceMode(SERVICE_MODE.LOGIN) 

Моя проблема заключается в том, что, где объявить перечисление (SERVICE_MODE), так как я должен пройти это в аргументе функции библиотеки, а значения для перечисления зависят от конкретного проекта. Я не хочу вносить изменения в свою библиотеку. Как достичь этого в java?

+0

Я не понимаю ваш вопрос ... как объявить тип? Тип, похоже, SERVICE_MODE – Stultuske

+0

Если вы не хотите, чтобы библиотека знала возможные значения перечисления, какой смысл это делает? –

+0

Мне нужно это, потому что я ударяю асинхронные сетевые хиты с различными SERVICE_MODES, из моего проекта и нуждаюсь в ответе в проекте после обработки в библиотеке. Поэтому моя цель - получить ответ с enum service_mode, который я передал при вызове службы из моего проекта. –

ответ

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); 
} 
+0

спасибо, этот работает. –

1

SERVICE_MODE нужно будет содержаться в библиотеке совместно обоими приложениями

0

Ваш класс служба не будет компилироваться, если SERVICE_MODE перечисление не находится в пути к классам. Из-за этой сильной зависимости лучшая идея заключается в добавлении этого перечисления в вашу библиотеку. Если вы не можете этого сделать, создайте новую библиотеку, которая будет вашей зависимостью.

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 параметризуется сам по себе.

Смежные вопросы