2013-03-15 3 views
1

Не знаете, как я собираюсь атаковать это.Значение возвращаемого переключателя на основе строки

В принципе, у меня есть ввод переменной длины, один или несколько раз, что вызовет действие. Это от ввода ввода, файла и т. Д.

Я понятия не имею, по каким и каким образом это можно решить. Было бы лучше, если бы функция возвращала int, которые соответствуют public static final int FOO = 1;, enum, другим способом?

То, что я как сейчас серия, если заявления, как в:

if (str.equals("foo") || str.equals("F")) { 
     blah; 
} else if (str.equals("beach")) { 
     more blah; 
} 

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

class Mother 
{ 

    HappyCamping() { 
     switch (ValInput(str)) { 
     case FOO: do fo; break; 
     case BAR: do bar; break; 
     case BAZ: do fo bar: break 
     ... 
    } 

    private enum ValInput(String str) 
    { 
     FOO("foo"), BAR("bar"), BAZ("baz"); 

     private int value; 

     private ValInput(String str) { 
       if (str.equals("blah")) 
        this.value = 1; 
       ... 
     } 
    } 
} 

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

+1

Я считаю, нет, но просто чтобы быть уверенным, вы используете Java 7? Вы можете использовать операторы 'switch' с объектами' String', если вы есть. – Gamb

+0

@ Gamb: Да, но если это (может) вызвать любые проблемы, я рад узнать. Мне нравится совместимость, так сказать. – Zimzalabim

+0

Это может вызвать проблемы, если ваше приложение должно быть брошено в среду Java 6. Это и многие другие вещи, специфичные для Java 7, если вы не работаете с установкой Java 6. Я бы придерживался перечислений, если вы так беспокоитесь о совместимости * назад. Если перечисления не могут использоваться в контексте, где у вас есть определенный набор параметров, для чего они хороши? Тем не менее, если у вас появятся новые возможности в будущем, вы можете подумать о том, чтобы остаться с 'if's, но так как вам все равно придется менять код, это ваш звонок. – Gamb

ответ

1

Один из подходов - написать парсер, который возвращает токены.Токены могут быть представлены ints или Enums. Это модулирует ваш код так, как вы хотите.

Другой способ - использовать перечисления.

public enum Token { 

    FOO("foo", "f"), 
    BAR("bar", "b"); 

    private String keyword; 
    private String abbreviation; 

    private Token(String keyword, String abbreviation) { 
     this.keyword = keyword; 
     this.abbreviation = abbreviation; 
    } 

    public String getKeyword() { 
     return this.keyword; 
    } 
    public String getAbbreviation() { 
     return this.abbreviation; 
    } 

    public static Token valueOf(String s) { 
     for (Token token : values()) { 
      if (token.getKeyword().equals(s) || token.getAbbreviation().equals(s)) { 
       return token; 
      } 
     } 
     throw new IllegalArgumentException("No such keyword: " + s); 
    } 
} 

Затем вы можете сделать что-то вроде:

switch (Token.valueOf(inputString)) { 
    case BAR : doBarStuff(); return; 
    case FOO : doFooStuff(); return; 
} 
+0

Спасибо! Я пойду. – Zimzalabim

+1

После того, как я вернулся, я закончил вариант такого подхода. При изменении имени 'valueOf' причина' method valueOf (String) уже определена в enum Token', кажется, что я хочу, где хочу. Благодарю. – Zimzalabim

1

Это хорошо, как любой, или есть лучший способ? Заглянули в перечисление, но похоже, что это больше для него, а затем, например, в C. Вероятно, это неправильно, но будет ли это что-то в этом направлении?

Затем перейдите, узнайте, как работает перечисление. Не избегайте функции, которая может решить вашу проблему только потому, что она имеет больше функций. Скорее всего, ваш дизайн захочет использовать перечисления в стиле Java, если вам нужен фиксированный набор действий.

enum Action { CLICK("click"), CLEAR("erase"); } 

и др. Хорошее начало.

Java (я думаю, с 6, возможно, 7) также поддерживает switch, беря строки вместо целых или перечисляемых значений.

+0

Да, поддержка 'switch' для' String' поддерживается Java с java 7. –

+0

Я не хочу этого избегать;). Моя проблема частично в лагере переживания языка столь же обширна/велика, что и проблема выбора хорошего подхода к дизайну. Просто нужно учиться на курсе, но иногда это происходит так: «Да, я могу сделать это так, это завершает задачу, - бит - это хороший способ?» – Zimzalabim

+0

@ user2148245 По некоторым соображениям я вспоминаю последний раз, когда мне приходилось это делать, и в этом случае я написал командную строку «Карта» для классов, которые были получены из базового класса с абстрактным методом «doAction (args)» или что-то в этом роде. Перечисления по существу не расширяются без их модификации, что является единственным компромиссом, который вы, возможно, захотите рассмотреть. – djechlin

1

Не уверен, что я понимаю всю проблему, но вы можете легко преобразовать строку в enum в Java.

Если строки ввода ограничены и предопределены, и вы хотите, чтобы разобрать его, как перечисление с использованием

EnumType.valueOf("foo") 

Я рекомендую прочитать на Java перечислений, они довольно мощные по сравнению с перечислениями C.

+0

Как правило, значения N должны давать 1 действие. Как и в «F», «fafa», «f» должно дать действие 1. «G», «gaga», ... должны дать действие 2. и т. Д. Это в первую очередь сводится к наилучшему подходу и, возможно, к * типичному * подходу. Самое близкое сходство, вероятно, было бы анализом argv. – Zimzalabim

1

В Java 7 вы можете использовать String в выражении switch. Обратитесь к this article:

switch (str) { 
    case "blah": 
    // some action 
    break; 
    case "beach": 
    // another blah 
    break; 
    default: 
    // default action 
    break; 
} 
+0

Спасибо. Я должен прочитать, насколько серьезным может быть ограничение кода на Java 7. – Zimzalabim

+0

@ user2148245 Можете ли вы уточнить? – assylias

+0

@assylias: Я имею в виду, что при использовании Java 7 может быть полная остановка, как в случае совместимости, или другие проблемы и т. Д. Обычно в каких средах это будет проблемой. Моя Java находится в Linux в обычной среде ПК, но я должен прочитать, на что/что/там, где обычно выбирают 6 из 7 и т. Д. – Zimzalabim

1

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


Рассмотрите возможность использования Карты и шаблона команды, как показано на рисунке here. Вы можете скрыть всю карту ключевого слова до функциональности и никогда не использовать if или switch.

+0

Да. Я согласен, когда дело доходит до того, что это не сложно. Моя проблема состоит из 600 строк инструкций if, где каждый из них, как некоторые базовые вызовы, зависит от того, как вводится анализ. Даже если бы я удвоился на слоях, он стал бы намного чище. Точка состоит в том, чтобы отделить «if» и «if», если «если» и «если» скомплектован модуль, и очистить код. Это будет означать менее сложный код, а не наоборот. – Zimzalabim

+0

@ user2148245 Я обновил свой ответ, основываясь на том, что вы сказали. Сначала я думал, что у вас есть только несколько «if-statements». но мы можем избежать необходимости во всех 'if' и' switch'. – andre

+0

Большое спасибо. Окончательно собирается проверить это. – Zimzalabim

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