2016-06-18 1 views
2

У меня есть много методов, которые выглядят так:Регулируемых/переменных случае переключатель в Java

switch(myEnum) { 
    case a : 
    case b : 
    case c : 
    case d : 
     modifier = 1.1; 
     break; 
    default : 
     break; 
} 

Было бы идеально, если я имел возможность сделать каждый случай и переменный модификатор, поэтому я может иметь один метод с 6 параметрами, 4 для случаев и 2 для модификатора. Что-то вроде следующего (псевдо):

public void setModifier(case1, case2, case3, case4, modifier, value) { 
    switch(myEnum) { 
     case case1 : 
     case case2 : 
     case case3 : 
     case case4 : 
      modifier = value; 
      break; 
     default : 
      break; 
    } 
} 

модификатора и значение не должно быть проблемой, но как я могу решить вариабельные случаи переключения? Возможно ли это в java с помощью оператора switch?

+0

Почему бы не использовать, если вместо использования переключателя? – SMA

+1

'модификатор 'будет влиять только на изменение внутри метода. Покажите нам практический пример, потому что это совершенно неясно. –

+0

Вы хотите, чтобы модификатор изменялся в случае переключателей – ThiepLV

ответ

5

Есть несколько проблем с этим подходом:

  • Вы не можете изменить значение параметра, переданного таким образом, что значение изменяется для вызывающего кода (в Java, для своего рода держатель типа, как AtomicReference и т.д., за исключением).
  • Попытка сделать общий код из-за возможного повторного использования не всегда является хорошей идеей, это, как правило, создает сложный общий код вместо удобочитаемого.
  • Похоже, что ваш код в основном является, если, так зачем записью написать его таким образом?

Если я понимаю ваш сниппета право, я хотел бы попробовать следующий встроенный подход:

if (EnumSet.of(a, b, c, d).contains(myEnum)) { 
    modifier = 1.1; 
} 

Это с моей точки зрения гораздо более чистой и, следовательно, имеет меньшую потребность извлечь его в общем виде и очень гибкий (любое количество значений перечисления и любое возможное действие).

Если вам действительно нужен такой подход, функциональный интерфейс может сделать работу:

setModifier(myEnum,() -> modifier = 1.1, a, b, c, d); 

public <E extends Enum<E>> void setModifier(E current, Runnable action, E... allowed) { 
    Arrays.stream(allowed) 
     .filter(one -> one == current) 
     .findAny() 
     .ifPresent(found -> action.run()); 
} 

Как вы можете видеть, это создает гораздо больше кода, который не является необходимым, если не используется распространение вокруг классов очень часто. Приведенный выше код работает только для modifier, являющегося членом не локальной переменной из-за неявного конечного поведения.

+0

Является ли это EnumSet классом java.util? Я не могу воссоздать этот фрагмент кода, но он выглядит многообещающим. EDIT: Он работает, это именно то, что мне нужно, супер компактный. – leimooo

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