Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改if-else以切换字符串_Java_Switch Statement_If Statement - Fatal编程技术网

Java 更改if-else以切换字符串

Java 更改if-else以切换字符串,java,switch-statement,if-statement,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 */

如何使用
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);
    }

}

switch
在大多数语言(包括java)中,只适用于本质上是整数的数据类型:


不能对字符串使用开关。抱歉。

如果您确实以
字符串的形式接收
localName
,则不能<代码>开关
仅适用于
字节
字符
整数
和枚举()。

使用字符串进行开关 你不能。Java 1.6不支持带字符串的switch语句

Java1.7可能会(这是的特性之一),但对于1.6,您应该使用枚举(最佳选择)或使用映射

使用映射的伪开关 以下是方法:

创建一个接口:

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");
    }
});

在您的情况下,应该使用,而不是字符串文字,然后您可以在开关情况下参考
enum

进一步参考


您无法避免使用
if-else
,因为:

开关与短字节一起工作, char和int基元数据类型。信息技术 也适用于枚举类型 (在类和继承中讨论) 还有一些特殊的“包装”类 某些基本类型:字符, 字节、短字符和整数(在中讨论 简单数据对象)


发件人:

如果您知道可能的答案,您可以做如下操作:

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;
        }
        ...
}
只有当您知道期望值并且它们都需要有不同的第一个字符时,这才有效!
此解决方案不会为您赢得美容服务,但可以回答您的问题;-)

如果可以用枚举替换字符串,那么就这样做——正如前面所说的那样。如果不能,可以获取字符串的枚举,如下所示:

声明和初始化
这有点冗长,但不是很糟糕,使用enum是一种乐趣D

在Java7中,您将能够使用字符串,因为现在您可以使用这样的枚举

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

我通过将“开关”更改为“如果”来解决此问题 诸如此类:

SiteList siteList = providers.get(localName).provide();
if (mystring.equals("string")
   thisstring="vi";

枚举本质上是整数吗?在某种程度上,我想:-)一个例外是PHP,其中switch语句同样适用于字符串。我认为部分问题在于Java中的字符串不是一种基本类型,比较引用没有意义。我希望==意味着将对象与.equals()进行比较,并且有一个特殊的方法来比较引用,因为将对象与.equals()进行比较是最常见的事情。此外,switch语句可能足够聪明,可以为对象调用.equals()。遗憾的是,它不能以这种方式工作。@stivlo Java的开关使用编译时常量。使用equals()意味着运行时评估,这可能会导致各种有趣的副作用。很快就会出现带有字符串文本(编译时常量)的开关,这很好。但您所描述的内容并不符合Java的静态特性。@Sean感谢您的解释。我不推荐这种方法,它不够广泛(仅限于第一个字符),使用限制,甚至可能导致加载XML以获得所有标记都应该具有唯一的第一个字符的约束。我将考虑分离枚举名称和字符串值,以允许额外的功能。另请参见:反向枚举“模式”(?)。您也可以将键(字符串)及其对应的枚举存储在一个映射中,以便进行非常快速的查找。如果你有很多失误,它会更快。你有任何性能比较吗?
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;
}
if (mystring.equals("string")
   thisstring="vi";