如何使用Switch与字符串

时间:2012-02-24 18:19:50

标签: java android

我有下面的代码,我写的是为了摆脱一大堆if if else语句。唯一的问题是,我刚刚发现Switch语句不能与字符串一起使用。

有没有办法解决这个问题?

由于

switch(xpp.getName()) {
            case("creature") : attribID = Integer.parseInt(xpp.getAttributeValue(0));
            case("name") : elName = xpp.getName(); break;
            case("race") : elName = xpp.getName(); break;
            case("gender") : elName = xpp.getName(); break;
            case("alignment") : elName = xpp.getName(); break;
            case("age") : elName = xpp.getName(); break;
            case("condition") : elName = xpp.getName(); break;
            case("skinColor") : elName = xpp.getName(); break;
            case("hairColor") : elName = xpp.getName(); break;
            case("size") : elName = xpp.getName(); break;
            case("height") : elName = xpp.getName(); break;
            case("weight") : elName = xpp.getName(); break;
            case("hitPoints") : elName = xpp.getName(); break;
            case("armorClass") : elName = xpp.getName(); break;
            case("actionPoints") : elName = xpp.getName(); break;
            case("magicPoints") : elName = xpp.getName(); break;
            case("strength") : elName = xpp.getName(); break;
            case("dexterity") : elName = xpp.getName(); break;
            case("intelligence") : elName = xpp.getName(); break;
            case("weapon") : elName = xpp.getName(); break;
            case("armor") : elName = xpp.getName(); break;
            case("magicItem") : elName = xpp.getName(); break;
            case("attackSpell") : elName = xpp.getName(); break;
            case("defenseSpell") : elName = xpp.getName(); break;
            case("item1") : elName = xpp.getName(); break;
            case("item2") : elName = xpp.getName(); break;
        }

5 个答案:

答案 0 :(得分:3)

作为替代方案,如果您不能只切换到Java 7,最简单的方法是用一堆if else替换switch语句。或者,您可以尝试打开字符串的hashCode,但我只建议您确定没有冲突(hashCode()不能保证防止冲突!)。最清晰,最简单的解决方案是使用if else。它保持可读性,并允许您仍然支持旧版本的Java。

编辑:只有一个案例有所不同!为什么不简单地做:

if (xpp.getName().equals("creature") {
    attribID = Integer.parseInt(xpp.getAttributeValue(0));
} else {
    elname = xpp.getName();
}

答案 1 :(得分:2)

Java 7支持切换字符串,但它不适用于android。

我建议使用枚举。创建一个枚举类并将枚举命名为预期的字符串。然后,您可以确定给定String的枚举并切换它。

以下是一个例子:

<强> Number.java

public enum Number { one, two, three }

<强> Switcher.java

public class Switcher {
    public static void main(String[] args) {
        String input = "one";
        switch (Number.valueOf(input)) {   // <- that's the magic!
        case one:System.out.println("1");break;
        case two:System.out.println("2");break;
        case three:System.out.println("3");break;
        }
    }
}

答案 2 :(得分:2)

重新考虑你的设计。使其更加面向对象。使用匿名类,或者某种调度表。或者只是简化它。看起来无论如何只有两个选择(“生物”做一件事,另外做另一件事)。难以维护的代码是重构的主要候选者。

答案 3 :(得分:2)

对于exept的所有情况你都在做同样的事情,然后xpp.getName()是“creature”。这意味着您可以轻松地将所有代码转换为singel if语句

if ( xpp.getName().equal("creature"))
     attribID = Integer.parseInt(xpp.getAttributeValue(0));
else
     elName = xpp.getName();

看起来您应该开始编程更多面向对象并创建一些类而不是使用名称来确定对象是什么

答案 4 :(得分:1)

字符串的开关仅适用于Java 7.因此,您需要使用Java 7 SDK来编译代码。

但是,如果您使用Eclipse作为开发Android应用程序的IDE,则无法为Android项目将代码合规级别设置为Java 7。然后你要么必须等待android人员支持java 7,要么使用IntelliJ或者使用java 7 sdk从命令行编译你的代码,然后使用dex编译器...