Как передать разные типы перечисления в метод? - PullRequest
6 голосов
/ 18 января 2011

У меня есть метод, который берет enum и использует его каким-то образом. Проблема в том, что у меня много разных типов перечислений, и я не являюсь приемлемой практикой передавать перечисления методу.

1 Ответ

13 голосов
/ 18 января 2011

Я предполагаю, что вы имеете в виду, что у вас есть набор различных классов 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) {
          ...
       }
   }       
}

Теперь в моей реальной реализации у меня есть несколько методов в интерфейсе маркера.Так что на самом деле это даже не должен быть интерфейс маркера;может содержать методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...