有好的方法可以替代 if else 和switch吗?

[code="java"]if(name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name"))
  switch (name) {
case "name":
break;
case "name":
break;
case "name":
break;
case "name":
break;
case "name":
break;
case "name":
break;
case "name":
break;

case "name":
break;

case "name":
break;

case "name":
break;

case "name":
break;

case "name":
break;

case "name":
break;

case "name":
break;

}
}[/code]
我现在前台有很多种name值,大概有60多个不同name,每个name既可以对应不同值也可以多name值组合成一个值。
我现在一个方法中条件语句判断用了大概40多个变量来判断,但是这样用if else 来判断性能显得不高。大家有什么好的方法替代if else 吗?

把所有name值预先存放到List中,用indexOf方法来判断
[code="java"]
List list= new ArrayList();
list.add("name1");
list.add("name2");
.
.
.
if(list.indexOf(name)>-1){//如果大于-1为存在的name

}
[/code]

可以吧name给拼接成一个字符串如String s=",name,name,"

使用if(s.indexOf(","+name+",")>-1)判断

引入规则引擎类似机制,对于诸多的name进行过滤,一旦满足要求的name传入之后可以依照指定好的逻辑进行处理!先定义filter接口,当中只有一个方法即applicable(String name),这个方法可以实现多个,对于不同种类的name进行过滤。一旦传入的name能够通过filter的校验,那么即可寻找对应的处理逻辑,再编写一个接口Action,当中也只需提供一个方法即可:doAction(),这里面即针对某种name进行操作,或者一类的name可以使用一个action。

查表啊。

String[] names = {"name1", "name2", "name3"};
String[] handlers = {"handler1", "handler2", "handler3"};

int index = Arrays.asList(names).indexOf(name);
if(index == -1 || index >= handlers.length){
throw new RuntimeException("无效的name");
}
String handler = handlers[index];
// 处理handler

可以用Set或者Map等集合来判断,一开始先初始化好Set或者Map,然后
Map:containsKey、containsValue
Set:contains
如果用楼上的if(s.indexOf(","+name+",")>-1)来判断,如果name本身包含逗号就会比较困扰。

Drools?

实际上绝大多数的if语句和switch语句(尤其switch语句)都是不必要的,或者说是可以使用顺序语句来代替的,这里的做法有一个很大的问题:就是增加name的时候需要修改代码,并且name的无限制增长会给代码带来恐怖的switch规模,所以设计上需要让name的变更(增加或删除)尽可能不去修改代码(而是增加一个类或者删除一个类、只是更改配置等),可选择的策略有如下几种(可能不仅限于这么多):

  1. 命令模式:比如把每个name(或者多个name组合)封装成一个个命令对象,那么程序的执行过程是,首先按照那么去查找command,比如command提供一个isMatch(String name)的方法,执行过程就比较简单了,command.execute(...),这样增加name就是增加一个command类;

  2. 使用Disptcher+Handler的模式,即所有的请求集中在Dispatcher,而Dispatcher根据规则(简单的Map或者复杂的规则都可以,根据实际情况),分发给不同的Handler;

  3. 使用一个表(List、Set等)来存储name,这个最简单,貌似有人提过了。

总体上来说解决程序分支复杂性的关键是:[b]将简单数据类型(比如String,int等)转化为对象类型进行处理(比如name --> command),这样可以将数据和数据的操作(对象类型中定义的)很好的结合在一起。[/b]

感觉业务逻辑没有吃透,才会有这许多if.

试着用面向对象的思维来思考这些name,这些name本身就是一个个对象的实例,还是它们属于其他的对象,如果他们属于其他对象,那么这个其他对象又是个什么东西,他为什么会有这许多不同的name,这些name是他的一个属性,还是他的一种状态,亦或是他的一种行为,是不是应该从多态的角度来思考这些name,或者这些对象,等等...

建议把具体业务逻辑描述出来,大家一起出出主意,学习学习.