Я предполагаю, что вы имеете в виду, что у вас есть набор различных классов enum, которые означают отдельные вещи, и что вы хотите передать их в один метод.
Для этого используйте маркер 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);
В целом, вполне допустимо использовать перечисление в качестве типа параметра для аргумента метода.
UPDATE
Я использовал этот шаблон при интеграции со сторонними 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) {
...
}
}
}
Теперь в моей реальной реализации у меня есть несколько методов в интерфейсе маркера.Так что на самом деле это даже не должен быть интерфейс маркера;может содержать методы.