Изменение if else для переключения на строку - PullRequest
3 голосов
/ 24 января 2011

Как написать следующий метод, используя switch case вместо if else

public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException 
{

    currentElement = true;

    if (localName.equals("maintag"))
    {
        /** Start */ 
        sitesList = new SitesList();
    } else if (localName.equals("website")) {
        /** Get attribute value */
        String attr = attributes.getValue("category");
        sitesList.setCategory(attr);
    }

}

Ответы [ 9 ]

7 голосов
/ 24 января 2011

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

Дополнительная справка

5 голосов
/ 24 января 2011

Переключение с использованием строк

Ты не можешь. Java 1.6 не поддерживает операторы switch со строками.

Java 1.7 возможно будет (это одна из особенностей Project Coin ), но для 1.6 вы должны либо использовать enum (лучший выбор), либо использовать карту иным образом.

Псевдо-переключатель с использованием карты

Вот как:

Создать интерфейс:

interface SiteListProvider{
    SitesList provide();
}

Теперь создайте карту, которая отображает строки для различных реализаций SiteListProvider:

Map<String, SiteListProvider> providers =
    new HashMap<String, SiteListProvider>();
providers.put("foo", new SiteListProvider(){
    public SitesList provide(){
        return new SiteList("foo", "bar", "baz");
    }

});
providers.put("phleem", new SiteListProvider(){
    public SitesList provide(){
        return new SiteList("otherstuff");
    }
});

А теперь используйте это так:

SiteList siteList = providers.get(localName).provide();
2 голосов
/ 24 января 2011

switch в большинстве языков, включая Java, работает только с типами данных, которые являются целыми числами в сердце: http://download.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

Вы не можете использовать переключатель со строками.К сожалению.

1 голос
/ 24 января 2011

В Java 7 вы сможете использовать строки, сейчас вы можете использовать перечисление, подобное этому.

enum LocalName {
    maintag, website, UNKNOWN;
    public static LocalName lookup(String text) {
        try {
            return valueOf(text);
        } catch(Exception e) {
            return UNKNOWN;
        }
     }
}

switch(LocalName.lookup(localName)) {
    case maintag:
        /** Start */ 
        sitesList = new SitesList();
        break;
    case website:
        /** Get attribute value */
        String attr = attributes.getValue("category");
        sitesList.setCategory(attr);
        break;
}
0 голосов
/ 18 марта 2016

Я решаю эту проблему, изменяя «switch» на «if» как-то так:

if (mystring.equals("string")
   thisstring="vi";
0 голосов
/ 24 января 2011

Если вы можете заменить String на перечисление, сделайте это - как уже было сказано.Если вы не можете, вы можете получить перечисление для String следующим образом:

Объявление и инициализация

enum LocalName {MAINTAG, WEBSITE}
private final static Map<String, LocalName> localNameForString
    = new HashMap<String, LocalName>();
static {
    for (LocalName n : LocalName.values()) {
        localNameForString.put(n.name().toLowerCase(), n);
    }
}

Использование

LocalName n = localNameForString.get(localName);
if (n==null) {
   // do something
} else  switch (n) {
    ...
}

Это немного многословно, ноне очень плохо, а работать с перечислениями одно удовольствие.: D

0 голосов
/ 24 января 2011

Если вы знаете, каковы возможные ответы, вы можете сделать что-то вроде:

public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException 
        {

        currentElement = true
        switch(localName.charAt(0)) {
           case 'm':
               sitesList = new SitesList();
               break;
           case 'w':
               String attr = attributes.getValue("category");
               // etc.
               break;
           default:
               break;
        }
        ...
}

Это работает, только если вы знаете ожидаемые значения, и у них всех должен быть другой первый символ!Это решение не принесет вам красоты, но это ответ на ваш вопрос; -)

0 голосов
/ 24 января 2011

Вы не можете избежать if else, поскольку:

Переключатель работает с примитивными типами данных байтов, коротких символов, символов типа char и int.Он также работает с перечисляемыми типами (обсуждается в классах и наследовании) и несколькими специальными классами, которые «оборачивают» определенные примитивные типы: Character, Byte, Short и Integer (обсуждаются в простых объектах данных).

От: http://download.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

0 голосов
/ 24 января 2011

Если вы действительно получаете localName как String, вы не можете. switch работает только с byte, short, char, int и перечислениями ( ссылка ).

...