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