排除if的最佳方法,结果调用多个方法

时间:2012-06-26 05:46:02

标签: java jsp servlets

我有一个用JSP制作的表单,这里有多个按钮 - “批准,拒绝,保存,取消”。 对于每个提交,控件转到一个Controller(Servlet),我在那里处理这个提交为::

String methodName = (String) request.getParameter("methodName");
if(methodName.trim.toLower().equals("approve")) 
{
  approve_Claim(parameters);
}
else if(methodName.trim.toLower().equals("reject")) 
{
  reject_Claim(parameters);
}
else if(methodName.trim.toLower().equals("save")) 
{
  save_Claim(parameters);
}
else if(methodName.trim.toLower().equals("cancel")) 
{
  cancel_Claim(parameters);
}

有没有办法删除这些倍数if, 请建议

4 个答案:

答案 0 :(得分:3)

看起来您基本上需要从methodName.trim().toLower()映射到某种带有参数的“声明操作”。创建一个这样的界面:

interface ClaimAction
{
    void execute(Parameters parameters);
}

然后使用CancelClaimActionApproveClaimAction等类实现此功能。接下来创建一个Map<String, ClaimAction>映射“批准”到ApproveClaimAction等。然后:

String actionName = methodName.trim().toLower(Locale.US));
ClaimAction action = CLAIM_ACTION_MAPPING.get(actionName);
if (action != null)
{
    action.execute(parameters);
}
else
{
    // Error case, presumably.
}

可以使用枚举来执行此操作,但我期望这些类中的每一个都有足够的工作要做,因此值得将它们分开并测试每一个单独

答案 1 :(得分:1)

我想到的一些替代方案是使用switch语句:

  1. 在参数中传递整数而不是字符串,在servlet中将它们解析为int,然后在整数上使用switch case。
  2. 如果您使用的是Java 7,请使用switch case over string。
  3. 在java 6中获取此字符串的枚举然后切换它们 - 对于旧版本,最多为java 5,(因为Enum是在java 5中引入的,由Jon双向飞碟提及)

答案 2 :(得分:0)

必须在某处完成关于触发动作的比较。你可以使用类似这样的东西从这个地方删除这个逻辑

public void handleRequest(HttpServletRequest request, String action){}

但正如我所说,验证必须在代码的某处......

答案 3 :(得分:0)

首先建议您可以重新考虑方法本身。很多MVC框架都在那里(如struts,struts2,spring MVC,play框架),它可以为您提供所有处理部分,让您的实际代码非常简单和干净。


假设您有一些特定目的使用自己的实现,我建议您可以使用java反射。

String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName).invoke(this);

你需要做的是保持methodNames与acutal java方法相同。

要传递参数,您可以这样做 -

String methodName = (String) request.getParameter("methodName");
this.getClass().getMethod(methodName, Paramter.class).invoke(this, parameters);