2016-08-29 3 views
0

Цель:Правильный путь испытания, что строка принадлежит подмножеству констант (Java)

  • Представляют подмножество строк, созданных из строк, определенных в абстрактном классе
  • тест, если строка на входе принадлежит к данной подгруппе

Первоначальное решение:

Давайте Лис t возможных событий.

/** 
* List of events. 
*/ 
public abstract class EventKeys { 

    public static final String KEY_EVENT_1 = "EVENT_1"; 
    public static final String KEY_EVENT_2 = "EVENT_2"; 
    public static final String KEY_EVENT_3 = "EVENT_3"; 
    public static final String KEY_EVENT_4 = "EVENT_4"; 
    public static final String KEY_EVENT_5 = "EVENT_5"; 
    public static final String KEY_EVENT_6 = "EVENT_6"; 
    public static final String KEY_EVENT_7 = "EVENT_7"; 
    //etc .. 
} 

Я хочу сделать подмножество этих событий, например, событий 1,3,5, и только для этих событий разрешить некоторые действия. Цель заключается в том, что метод boolean isEventAllowed (String eventKey), который скажет, что событие принадлежит подмножеству разрешенных событий.

Действительно наивный способ сделать это:

/** 
* Allow only events 1,3,5 
*/ 
private isEventAllowed(String eventKey) { 

    if(eventKey.equals(EventKeys1.KEY_EVENT_1)) { 
     return true; 
    } else if(eventKey.equals(EventKeys1.KEY_EVENT_3)) { 
     return true; 
    } else if(eventKey.equals(EventKeys1.KEY_EVENT_3)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

Я чувствую этот подход не очень удобно. Мне нужен лучший способ для представить подмножество строк и обеспечить действие. Строка ввода принадлежит определенному подмножеству?

Другие возможные решения:
В качестве других вариантов я думал о двух других вариантов, но я до сих пор не уверен, что его хороший способ сделать это. 1) перечисление - создать перечисление строк

  • Put в перечислении: EventKeys1.KEY_EVENT_1, EventKeys1.KEY_EVENT_2, EventKeys1.KEY_EVENT_3
  • Test делает Строка KeyEvent belons для определенного перечисления?

2) Список

  • создать список List<String> subset и поставить там EventKeys1.KEY_EVENT_1, EventKeys1.KEY_EVENT_2, EventKeys1.KEY_EVENT_3
  • тест, если строка KeyEvent принадлежит к списку подмножество


ПОЖАЛУЙСТА, ПРОЧТИТЕ ЭТО ПЕРЕД ОТВЕТОМ:

  • EventKeys класса дается, не может быть изменен, основной набор опций
  • мне нужно как-то представляет подмножество
  • Мне нужен совет для более эффективной реализации метода isAllowedEvent (String KeyEvent), которая возвращает true, если строка ввода принадлежит определенному подмножеству
+1

Рассмотрите возможность использования 'java.util.Set' (например,' 'java.util.HashSet', java.util.TreeSet', ...) –

+0

@ B.Kemmer на момент в коде, позже, может быть, в каком-то файле конфигурации, который каким-либо образом будет отображаться в абстрактном классе KeyEvent. Usecase заключается в том, что на событиях в абстрактном классе делается какое-то действие, мне нужно сделать какое-то другое действие только для некоторых событий и нужно каким-то образом представлять подмножество. Согласно комментариям, наиболее подходящим может быть, вероятно, HashSet + содержит (eventKey) Это понятно и легко настраивается и дефинити лучше, чем если/else, если решение – user1097772

+0

@jameslarge спасибо за подсказку HashSet, вероятно, будет то, что я хочу – user1097772

ответ

2

Как насчет этого?

private boolean isEventAllowed(String eventKey) { 
     return Arrays.asList(KEY_EVENT_1, KEY_EVENT_3, KEY_EVENT_5).contains(eventKey); 
    } 

читаемость можно улучшить следующий John Fergus' комментария, используя что-то вроде этого:

private static List<String> SUBSET = Arrays.asList(KEY_EVENT_1, KEY_EVENT_3, KEY_EVENT_5); 

    private boolean isEventAllowed(String eventKey) { 
     return SUBSET.contains(eventKey); 
    } 
+0

OP - подмножество'? Вы можете определить отдельные ключи, а затем также определить «подмножество» в массивах, чтобы вы могли создавать EventKeys.ASubSet.contains (eventKey) на нем? –

+1

Я, вероятно, буду использовать Set subset = new HashSet (); для подмножества вместо Arrays.asList, но идея по-прежнему такая же. Спасибо – user1097772

0

Хотя Set проведения допустимых значений, как правило, является предпочтительным вариантом, есть также возможные синтаксические улучшения для ваших исходный код, о котором вам следует знать, поскольку их общий шаблон применим и к другим ситуациям.

заявление, как

if(condition1) 
    action; 
else if(condition2) 
    /* (same) */ action; 
… 

является избыточным и может быть заменен

if(condition1 || condition2) 
    action; 
… 

аналогично

if(condition) 
    return true; 
else 
    return false; 

является избыточным и может (или даже должны) быть заменены

return condition; 

Положив оба вместе, ваш исходный код становится

private boolean isEventAllowed(String eventKey) { 
    return eventKey.equals(EventKeys1.KEY_EVENT_1) 
     || eventKey.equals(EventKeys1.KEY_EVENT_3) 
     || eventKey.equals(EventKeys1.KEY_EVENT_5); 
} 

В качестве альтернативы, вы можете использовать switch заявление:

private boolean isEventAllowed(String eventKey) { 
    switch(eventKey) { 
     case EventKeys1.KEY_EVENT_1: 
     case EventKeys1.KEY_EVENT_3: 
     case EventKeys1.KEY_EVENT_5: 
      return true; 
     default: 
      return false; 
    } 
} 

Не всем нравится этот стиль, но это скорее вопрос о проекте или политика компаний. Есть ситуация, когда такой оператор switch по-прежнему является самым чистым решением. Одним из преимуществ над операторами if и даже подходом Set является то, что компилятор немедленно закричит, если вы ошибочно назовете одну и ту же константу дважды, а не предполагаемую константу (типичная копия ошибки &), как и в третьем заявлении if, в котором вы используете KEY_EVENT_3 вместо предполагаемого KEY_EVENT_5 ...