看起来您正在使用自定义代码进行 XML 解析。这通常不是一个好主意,最好使用解析器。并且使用一些解析器,您的结构会发生足够的变化,以至于问题会变得有些无关紧要。
但是根据解析器的不同,关于代码结构(尤其是if
or的长列表if...else if
)的问题可能仍然存在,所以我将解决它:
if...else if
在这里是正确的构造,除非可能同时满足多个条件,并且您希望在每种情况下都进行工作。如果是这样,那么您所拥有的 ( if...if
) 是正确的构造。
switch
除非您正在测试的东西是常量或枚举,否则在这里没有用处。您正在使用contains
,因此不适用。Java 不允许在case
s 中使用表达式,它们必须是常量或枚举(引用),因此if...else if
或者if...if
是您可以对正在使用的字符串做的最好的事情。
嗯,不,实际上:你可以(如果有很多这些,如你所说,可能应该)重构该代码以使用命令模式和循环,例如(伪代码):
TagCommands[] commands = /* ...objects that have the tag name
and function to call... */;
for (TagCommands command : commands) {
if (command.matches(xmlRequest, xmlRequestBody) {
command.execute(/*...relevant args here...*/);
}
}
...哪里TagCommand
看起来像这样:
interface TagCommand {
void setTag(String tag);
String getTag();
boolean matches(String request, String requestBody);
void execute(/*...relevant args here...*/);
}
...可能与
abstract class TagCommandBase implements TagCommand {
private String tag;
TagCommandBase(String tag) {
this.setTag(tag);
}
void setTag(String tag) {
this.tag = tag;
}
String getTag() {
return this.tag;
}
boolean matches(String request, String requestBody) {
return request.contains("<" + this.getTag() + ">") &&
requestBody.contains("</" + this.getTag() + ">");
}
}
}
...然后你创建你的数组,TagCommand
使用实现的每个标记的具体实现execute
(声明的类或匿名类)。