更改if else切换字符串

时间:2011-01-24 10:13:10

标签: java switch-statement if-statement

如何使用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 个答案:

答案 0 :(得分:7)

在您的情况下,您应该使用ENUM,而不是字符串文字,然后您可以在切换案例中引用enum

进一步参考

答案 1 :(得分:5)

使用字符串切换

你做不到。 Java 1.6不支持使用字符串的switch语句。

Java 1.7可能会(它是Project Coin的功能之一),但对于1.6,您应该使用枚举(最佳选择)或以其他方式使用地图。

使用Map

的伪开关

以下是:

创建一个界面:

interface SiteListProvider{
    SitesList provide();
}

现在创建一个Map,将字符串映射到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 :(得分:2)

大多数语言中的

switch,包含java,仅适用于整体为核心的数据类型:http://download.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

您不能将开关与字符串一起使用。遗憾。

答案 3 :(得分:1)

在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;
}

答案 4 :(得分:0)

如果您真的收到localName作为String,则不能。 switch仅适用于byteshortcharint和枚举(reference)。

答案 5 :(得分:0)

你无法避免if else

  

一个开关与字节一起工作,简短,   char和int原始数据类型。它   也适用于枚举类型   (在类和继承中讨论)   还有一些“包装”的特殊课程   某些原始类型:角色,   字节,短整数和整数(在中讨论)   简单数据对象)。

来自:http://download.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

答案 6 :(得分:0)

如果您知道可能的答案是什么,您可以执行以下操作:

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;
        }
        ...
}

仅当您知道预期值并且它们都需要具有不同的第一个字符时才有效! 此解决方案不会获得美容价格,但可以回答您的问题; - )

答案 7 :(得分:0)

如果您可以用枚举替换字符串,那么就这样做 - 正如已经说过的那样。如果你不能,你可以获得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

答案 8 :(得分:0)

我通过改变&#34;开关来解决这个问题。 for&#34; if&#34; 这样的事情:

CMMotionManager